Création du framework JAVA "numatrix" qui génère facilement des valeurs numériques uniques dans un environnement distribué et multi-thread

Aperçu

numatrix est un framework qui génère des nombres 64 bits uniques dans un environnement distribué qui fonctionne en parallèle.

Fonctionnalité

Le fait d'avoir un ID unique pour chaque JVM distribuée permet à chacun de générer un numéro unique à tous les niveaux. Parce que chacun est indépendant, il fonctionne très vite. Il est thread-safe et fonctionne en parallèle pour chaque thread.

spécification

numatrix décompose 64 bits en 3 champs et attribue une valeur à chacun.

  1. Horodatage Le nombre de bits par défaut dans ce champ est de 32 bits. La valeur est le nombre de secondes qui se sont écoulées depuis le ** temps de référence **. L'heure standard est 0:00 le 3 novembre 2017 par défaut. La valeur est déterminée lorsque vous commencez à publier le nombre et est mise à jour lorsque le prochain ** numéro consécutif ** revient à 0.
  2. Numéros consécutifs Le nombre de bits dans ce champ est le reste du nombre de bits consommés par le ** horodatage ** précédent et l'ID unique ** dans l'environnement ** suivant. La valeur commence à 0 et est incrémentée chaque fois que vous émettez un nombre. Lorsque le nombre de bits de ce champ est dépassé, il revient à 0 et met à jour la valeur du ** horodatage ** précédent.
  3. ID unique dans l'environnement Le nombre de bits dans ce champ est déterminé par le nombre maximal de JVM et de threads dans votre environnement. La valeur est un nombre émis pour garantir qu'elle est unique dans votre environnement.

Le premier bit représente un signe, donc si vous n'émettez pas de valeur négative, il sera fixé à 0 et ne sera pas utilisé.

Comment utiliser

Téléchargez le source depuis numatrix et construisez avec maven.

Implémentation de NumatrixNumberGeneratorFactory

Créez une classe qui hérite de la classe NumatrixNumberGeneratorFactory.

package numatrix;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class NumatrixNumberGeneratorFactoryImple extends NumatrixNumberGeneratorFactory {

  @Override
  protected int getTypeId() {
    return 0;
  }

  @Override
  protected int getJvmId() {
    Properties properties = new Properties();
    try {
      properties.load(new FileInputStream("Chemin du fichier de propriété"));
  } catch (IOException e) {
      throw new RuntimeException(e);
  }
    return Integer.parseInt(properties.getProperty("jvmid"));
  }

  @Override
  protected int getMaxJvmCount() {
    return 100;
  }

  @Override
  protected int getMaxGeneratorCount() {
    return 300;
  }

}

Implémentation de getTypeId ()

Un numéro unique peut être généré pour chaque valeur de retour de cette méthode. Lorsque vous utilisez plusieurs numéros uniques, créez plusieurs classes qui implémentent cette méthode et utilisez-les correctement.

Implémentation de getJvmId ()

Veuillez renvoyer une valeur unique pour chaque JVM qui utilise cette classe d'implémentation dans un environnement dans lequel vous souhaitez que les nombres soient uniques. Veuillez utiliser les valeurs de retour dans l'ordre de 0.

Implémentation de getMaxJvmCount ()

Veuillez renvoyer le nombre maximal de machines virtuelles Java qui utilisent cette classe d'implémentation dans un environnement où vous souhaitez que les nombres soient uniques.

Implémentation de getMaxGeneratorCount ()

Veuillez renvoyer le nombre maximal d'instances NumatlixNumberGenerator générées pour chaque JVM. Une instance de NumatrixNumberGenerator est attribuée à chaque thread qui produit un numéro unique.

Générer des nombres à partir de l'instance NumatrixNumberGenerator

Obtenez une instance de NumatrixNumberGenerator à partir d'une instance de la classe d'implémentation NumatrixNumberGeneratorFactory et générez un numéro unique.

public class Sample {

  public static void main(String[] args) throws NumatrixNumberGenerateException {
    NumatrixNumberGeneratorFactoryImple factory = new NumatrixNumberGeneratorFactoryImple();
    NumatrixNumberGenerator generator = factory.getGenerator();
    long uniqueueNumber = generator.generate();

  }

}

Obtenir l'instance de NumatrixNumberGenerator

L'instance NumatlixNumberGenerator de la valeur de retour de getGenerator () est différente pour chaque thread qui l'a appelée. Si le thread qui a appelé getGenerator () n'est plus référencé et peut être détruit par garbage collection, l'instance NumatlixNumberGenerator de ce thread sera réutilisée par un autre thread.

Génération de numéros uniques

Vous pouvez générer un numéro unique avec NumatrixNumberGenerator # generate ().

Remarques

** numatrix ne sera plus disponible après environ 136 ans à compter de 2017. ** ** La solution de contournement sera expliquée dans Personnalisation.

Personnaliser

Vous pouvez le personnaliser en créant une classe qui hérite de la classe NumatrixNumberGenerator et en remplaçant chaque méthode. Remplacez la méthode getGenerator () dans la classe d'implémentation de NumatrixNumberGeneratorFactory et implémentez-la pour renvoyer une instance de la classe héritée.

public class NumatrixNumberGeneratorFactoryImple extends NumatrixNumberGeneratorFactory {

  class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
    //Personnaliser le générateur de nombres TODO Numatrix
    public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
      super(generatorId, generatorIdBitLength);
    }

  }

  @Override
  protected NumatrixNumberGenerator makeGenerator(int generatorId, int generatorIdBitLength) {
    return new NumatrixNumberGeneratorEx(generatorId, generatorIdBitLength);
  }

Augmentation du nombre maximum de sorties par seconde avec une valeur numérique unique (amélioration des performances)

Si un ** nombre consécutif ** d'un champ de trisection de 64 bits dépasse la valeur maximale, la valeur du champ d'horodatage doit être mise à jour, mais le champ d'horodatage est mis à jour toutes les secondes. Pour, ** Nombre maximum de nombres consécutifs = Nombre maximum de sorties par seconde qui est unique pour chaque thread ** Ce sera. Puisque le nombre de bits de nombres consécutifs est le reste du nombre de bits consommés par les autres champs, ** Vous pouvez augmenter la valeur maximale en réduisant le nombre de bits des autres champs. ** **

Comme le nombre de bits du champ ID unique à l'environnement est déterminé par l'implémentation de getMaxJvmCount () et getMaxGeneratorCount () de NumatlixNumberGeneratorFactory, le nombre de bits peut être réduit en réduisant leurs valeurs de retour.

Les autres champs modifient le nombre de bits comme suit.

Sortie de valeur négative

En autorisant la sortie de valeurs négatives, le premier bit de 64 bits devient disponible et le nombre de bits dans le champ numérique consécutif peut être augmenté.

public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {

  public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
    super(generatorId, generatorIdBitLength);
  }

  @Override
  public boolean isOutMinus() {
    return true;
  }

}

Changer le nombre de bits dans le champ d'horodatage

Vous pouvez augmenter le nombre de champs de nombres consécutifs en réduisant le nombre de bits dans le champ d'horodatage. La valeur initiale du champ d'horodatage est de 32 bits, ce qui peut représenter le nombre de secondes jusqu'à environ 136 ans, mais chaque fois que le nombre de bits est réduit de un, la valeur maximale de l'horodatage est divisée par deux et la date d'expiration est disponible. Sera plus court.

public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {

  public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
    super(generatorId, generatorIdBitLength);
  }

  @Override
  public int getTimestampBitLength() {
    //Réduire de 32 bits
    return 31;
  }

}

Prolongation de la période utilisable (2017 à 136 ans)

Un ** horodatage ** d'un 64 bits divisé en trois champs ne peut pas dépasser le nombre qui peut être représenté par le nombre de bits dans le champ (32 bits par défaut). Étant donné que l'horodatage correspond au nombre de secondes qui se sont écoulées depuis l'heure de référence (le paramètre par défaut est 00:00 le 3 novembre 2017), vous pouvez prolonger la période disponible en modifiant l'heure de référence. ** **

Changement d'heure de référence

Modifiez l'heure de référence. Pour l'heure de référence, définissez l'heure avant le début de l'utilisation de numatrix.

public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {

  public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
    super(generatorId, generatorIdBitLength);
  }

  @Override
  public Date getBaseTime() {
    try {
      //Changement d'heure de référence
      return new SimpleDateFormat("yyyyMMdd").parse("20171111");
    } catch (ParseException e) {
      throw new RuntimeException();
    }
  }

}

Recommended Posts

Création du framework JAVA "numatrix" qui génère facilement des valeurs numériques uniques dans un environnement distribué et multi-thread
J'ai créé un programme de jugement des nombres premiers en Java
J'ai créé un jeu Janken en Java (CLI)
J'ai fait un jeu de problèmes de calcul simple en Java
J'ai créé un Wrapper qui appelle KNP depuis Java
J'ai fait une roulette à Java.
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
J'ai essayé de créer un programme en Java qui résout le problème du voyageur de commerce avec un algorithme génétique
J'ai écrit une sorte de livre qui ressemble à Java
J'ai créé une source qui génère automatiquement un fichier de classe d'entité JPA
J'ai créé un PDF avec Java.
J'ai créé une application shopify @java
J'ai fait une annotation en Java.
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java
J'ai créé une classe qui génère automatiquement Json qui spécifie la texture de Minecraft [1.12.2]
Construction de l'environnement Play Framework 2.6 (Java) avec Eclipse
J'ai créé un nouvel outil de déploiement Java
J'ai essayé de mettre facilement CentOS-7 dans un PC dont je n'ai plus besoin
J'ai créé un outil Diff pour les fichiers Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai écrit un programme de jugement des nombres premiers en Java
Créons un framework Web ultra-simple avec Java
J'ai créé une application de visualisation qui affiche le PDF
J'ai créé une bibliothèque d'extension Ruby en C
Un fichier bat qui utilise Java dans Windows
J'ai écrit un programme de factorisation prime en Java
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)