Erstellt das JAVA-Framework "numatrix", das auf einfache Weise eindeutige numerische Werte in einer verteilten Umgebung und mit mehreren Threads generiert

Überblick

numatrix ist ein Framework, das in einer parallel ausgeführten verteilten Umgebung eindeutige 64-Bit-Zahlen generiert.

Charakteristisch

Mit einer eindeutigen ID für jede verteilte JVM kann jede eine eindeutige Nummer auf der ganzen Linie generieren. Da jeder unabhängig ist, läuft er sehr schnell. Es ist threadsicher und läuft für jeden Thread parallel.

Spezifikation

numatrix zerlegt 64 Bit in 3 Felder und weist jedem einen Wert zu.

  1. Zeitstempel Die Standardanzahl von Bits in diesem Feld beträgt 32 Bit. Der Wert ist die Anzahl der Sekunden, die seit der ** Referenzzeit ** vergangen sind. Die Standardzeit ist standardmäßig 0:00 am 3. November 2017. Der Wert wird bestimmt, wenn Sie mit der Veröffentlichung der Nummer beginnen, und aktualisiert, wenn die nächste ** fortlaufende Nummer ** auf 0 zurückkehrt.
  2. Aufeinanderfolgende Zahlen Die Anzahl der Bits in diesem Feld ist der Rest der Anzahl der vom vorherigen ** Zeitstempel ** verbrauchten Bits und der eindeutigen ID ** in der nächsten ** Umgebung. Der Wert beginnt bei 0 und wird jedes Mal erhöht, wenn Sie eine Zahl eingeben. Wenn die Anzahl der Bits in diesem Feld überschritten wird, kehrt es auf 0 zurück und aktualisiert den Wert des vorherigen ** Zeitstempels **.
  3. Eindeutige ID in der Umgebung Die Anzahl der Bits in diesem Feld wird durch die maximale Anzahl von JVMs und Threads in Ihrer Umgebung bestimmt. Der Wert ist eine Zahl, die ausgegeben wird, um sicherzustellen, dass er in Ihrer Umgebung eindeutig ist.

Das erste Bit stellt ein Vorzeichen dar. Wenn Sie also keinen negativen Wert ausgeben, wird es auf 0 festgelegt und nicht verwendet.

Wie benutzt man

Laden Sie die Quelle von numatrix herunter und erstellen Sie mit maven.

Implementierte NumatrixNumberGeneratorFactory

Erstellen Sie eine Klasse, die von der NumatrixNumberGeneratorFactory-Klasse erbt.

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("Pfad der Eigenschaftendatei"));
  } 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;
  }

}

Implementierung von getTypeId ()

Für jeden Rückgabewert dieser Methode kann eine eindeutige Nummer generiert werden. Wenn Sie mehrere eindeutige Nummern verwenden, erstellen Sie mehrere Klassen, die diese Methode implementieren, und verwenden Sie sie ordnungsgemäß.

Implementierung von getJvmId ()

Bitte geben Sie einen eindeutigen Wert für jede JVM zurück, die diese Implementierungsklasse in einer Umgebung verwendet, in der die Zahlen eindeutig sein sollen. Bitte verwenden Sie die Rückgabewerte in der Reihenfolge von 0.

Implementierung von getMaxJvmCount ()

Bitte geben Sie die maximale Anzahl von JVMs zurück, die diese Implementierungsklasse in einer Umgebung verwenden, in der die Nummern eindeutig sein sollen.

Implementierung von getMaxGeneratorCount ()

Bitte geben Sie die maximale Anzahl von NumatlixNumberGenerator-Instanzen zurück, die für jede JVM generiert wurden. Jedem Thread, der eine eindeutige Nummer erzeugt, wird eine NumatrixNumberGenerator-Instanz zugewiesen.

Generieren Sie Zahlen aus der NumatrixNumberGenerator-Instanz

Rufen Sie eine NumatrixNumberGenerator-Instanz von einer Instanz der NumatrixNumberGeneratorFactory-Implementierungsklasse ab und generieren Sie eine eindeutige Nummer.

public class Sample {

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

  }

}

Ruft die NumatrixNumberGenerator-Instanz ab

Die NumatlixNumberGenerator-Instanz des Rückgabewerts von getGenerator () ist für jeden Thread, der sie aufgerufen hat, unterschiedlich. Wenn der Thread, der getGenerator () aufgerufen hat, nicht mehr referenziert wird und durch Garbage Collection zerstört werden kann, wird die NumatlixNumberGenerator-Instanz dieses Threads von einem anderen Thread wiederverwendet.

Generierung eindeutiger Nummern

Sie können mit NumatrixNumberGenerator # generate () eine eindeutige Nummer generieren.

Vorsichtsmaßnahmen

** numatrix wird nach ca. 136 Jahren ab 2017 nicht mehr verfügbar sein. ** ** ** Die Problemumgehung wird unter Anpassung erläutert.

Anpassen

Sie können es anpassen, indem Sie eine Klasse erstellen, die von der NumatrixNumberGenerator-Klasse erbt, und jede Methode überschreiben. Überschreiben Sie die Methode getGenerator () in der Implementierungsklasse NumatrixNumberGeneratorFactory und implementieren Sie sie, um eine Instanz der geerbten Klasse zurückzugeben.

public class NumatrixNumberGeneratorFactoryImple extends NumatrixNumberGeneratorFactory {

  class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {
    //Passen Sie den TODO Numatrix Number Generator an
    public NumatrixNumberGeneratorEx(int generatorId, int generatorIdBitLength) {
      super(generatorId, generatorIdBitLength);
    }

  }

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

Erhöhung der maximalen Anzahl von Ausgängen pro Sekunde mit eindeutigem Zahlenwert (Leistungsverbesserung)

Wenn eine ** fortlaufende Zahl ** eines 64-Bit-Trisektionsfelds den Maximalwert überschreitet, muss der Wert des Zeitstempelfelds aktualisiert werden, das Zeitstempelfeld wird jedoch jede Sekunde aktualisiert. Zum, ** Maximale Anzahl aufeinanderfolgender Nummern = Maximale Anzahl von Ausgaben pro Sekunde, die für jeden Thread eindeutig ist ** Es wird sein. Da die Anzahl der Bits aufeinanderfolgender Nummern der Rest der Anzahl der von anderen Feldern verbrauchten Bits ist, ** können Sie den Maximalwert erhöhen, indem Sie die Anzahl der Bits anderer Felder verringern. ** ** **

Die Anzahl der Bits des ID-Felds, die für die Umgebung eindeutig sind, wird durch die Implementierung von getMaxJvmCount () und getMaxGeneratorCount () von NumatlixNumberGeneratorFactory bestimmt, sodass die Anzahl der Bits durch Reduzieren ihrer Rückgabewerte verringert werden kann.

Die anderen Felder ändern die Anzahl der Bits wie folgt.

Negative Wertausgabe

Durch Zulassen der Ausgabe negativer Werte wird das erste 1 Bit von 64 Bit verfügbar, und die Anzahl der Bits im Feld für fortlaufende Nummern kann erhöht werden.

public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {

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

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

}

Ändern Sie die Anzahl der Bits im Zeitstempelfeld

Sie können die Anzahl der aufeinanderfolgenden Nummernfelder erhöhen, indem Sie die Anzahl der Bits im Zeitstempelfeld verringern. Der Anfangswert des Zeitstempelfelds beträgt 32 Bit, was die Anzahl der Sekunden bis zu etwa 136 Jahren darstellen kann. Jedes Mal, wenn die Anzahl der Bits um eins verringert wird, wird der Maximalwert des Zeitstempels halbiert und das Ablaufdatum ist verfügbar. Wird kürzer sein.

public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {

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

  @Override
  public int getTimestampBitLength() {
    //Von 32 Bit reduzieren
    return 31;
  }

}

Verlängerung der Nutzungsdauer (2017 auf 136 Jahre)

Ein ** Zeitstempel ** eines 64-Bit-Bereichs, der in drei Felder unterteilt ist, darf die Anzahl nicht überschreiten, die durch die Anzahl der Bits im Feld dargestellt werden kann (standardmäßig 32 Bit). Da der Zeitstempel die Anzahl der Sekunden ist, die seit der Referenzzeit vergangen sind (Standardeinstellung ist 00:00 am 3. November 2017), können Sie den verfügbaren Zeitraum verlängern, indem Sie die Referenzzeit ändern. ** ** **

Änderung der Referenzzeit

Ändern Sie die Referenzzeit. Definieren Sie für die Referenzzeit die Zeit vor dem Beginn der Verwendung von numatrix.

public class NumatrixNumberGeneratorEx extends NumatrixNumberGenerator {

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

  @Override
  public Date getBaseTime() {
    try {
      //Änderung der Referenzzeit
      return new SimpleDateFormat("yyyyMMdd").parse("20171111");
    } catch (ParseException e) {
      throw new RuntimeException();
    }
  }

}

Recommended Posts

Erstellt das JAVA-Framework "numatrix", das auf einfache Weise eindeutige numerische Werte in einer verteilten Umgebung und mit mehreren Threads generiert
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Ich habe ein Roulette in Java gemacht.
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich habe versucht, ein Programm in Java zu erstellen, das das Problem des Handlungsreisenden mit einem genetischen Algorithmus löst
Ich habe eine Sterling-Sorte geschrieben, die sich wie in Java anfühlt
Ich habe eine Quelle erstellt, die automatisch eine JPA-Entitätsklassendatei generiert
Ich habe ein PDF mit Java erstellt.
Ich habe eine shopify App @java erstellt
Ich habe eine Anmerkung in Java gemacht.
Ich habe eine Klasse erstellt, die JUMAN und KNP aus Java verwenden kann
Ich habe eine Klasse erstellt, die automatisch Json generiert, die die Textur von Minecraft angibt [1.12.2]
Spielen Sie die Framework 2.6 (Java) -Umgebungskonstruktion mit Eclipse
Ich habe ein neues Java-Bereitstellungstool erstellt
Ich habe versucht, CentOS-7 einfach in einen PC zu integrieren, den ich nicht mehr benötige
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Lassen Sie uns mit Java ein supereinfaches Webframework erstellen
Ich habe eine Viewer-App erstellt, die PDF anzeigt
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
Eine Bat-Datei, die Java in Windows verwendet
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 1 (API Edition)