OK, das ist eine sehr alte Frage, die ich jetzt zum ersten Mal sehe.
Sie müssen zwischen Sequenznummern und eindeutigen IDs unterscheiden , die (optional) nach bestimmten Kriterien (normalerweise Generierungszeit) lose sortierbar sind. Wahre Sequenznummern implizieren das Wissen darüber, was alle anderen Arbeiter getan haben, und erfordern als solche einen gemeinsamen Zustand. Es gibt keine einfache Möglichkeit, dies auf verteilte, hochskalierte Weise zu tun. Sie können sich beispielsweise mit Netzwerksendungen, Fensterbereichen für jeden Mitarbeiter und verteilten Hash-Tabellen für eindeutige Mitarbeiter-IDs befassen , aber es ist viel Arbeit.
Eindeutige IDs sind eine andere Sache. Es gibt verschiedene Möglichkeiten, eindeutige IDs dezentral zu generieren:
a) Sie können den Snowflake ID-Netzwerkdienst von Twitter verwenden . Schneeflocke ist ein:
- Netzwerkdienst, dh Sie tätigen einen Netzwerkanruf, um eine eindeutige ID zu erhalten.
- die eindeutige 64-Bit-IDs erzeugt, die nach Generierungszeit geordnet sind;
- und der Dienst ist hoch skalierbar und (potenziell) hoch verfügbar; Jede Instanz kann viele tausend IDs pro Sekunde generieren, und Sie können mehrere Instanzen in Ihrem LAN / WAN ausführen.
- geschrieben in Scala, läuft auf der JVM.
b) Sie können die eindeutigen IDs auf den Clients selbst mithilfe eines Ansatzes generieren, der sich aus der Erstellung der UUIDs und der IDs von Snowflake ergibt . Es gibt mehrere Optionen, aber etwas in der Art von:
Die höchstwertigen 40 Bits: Ein Zeitstempel; die Generierungszeit der ID. (Wir verwenden die höchstwertigen Bits für den Zeitstempel, um IDs nach Generierungszeit sortierbar zu machen.)
Die nächsten 14 Bits: Ein Zähler pro Generator, den jeder Generator für jede neu generierte ID um eins erhöht. Dadurch wird sichergestellt, dass sich zum gleichen Zeitpunkt generierte IDs (gleiche Zeitstempel) nicht überlappen.
Die letzten 10 Bits: Ein eindeutiger Wert für jeden Generator. Auf diese Weise müssen wir keine Synchronisation zwischen Generatoren durchführen (was extrem schwierig ist), da alle Generatoren aufgrund dieses Werts nicht überlappende IDs erzeugen.
c) Sie können die IDs auf den Clients mit nur einem Zeitstempel und einem zufälligen Wert generieren . Dies vermeidet die Notwendigkeit, alle Generatoren zu kennen und jedem Generator einen eindeutigen Wert zuzuweisen. Auf der anderen Seite ist nicht garantiert , dass solche IDs global eindeutig sind, sondern nur sehr wahrscheinlich eindeutig. (Um zu kollidieren, müssten ein oder mehrere Generatoren genau zur gleichen Zeit denselben Zufallswert erstellen.) Etwas in der Art von:
- Die höchstwertigen 32 Bit: Zeitstempel, die Generierungszeit der ID.
- Die niedrigstwertigen 32 Bit: 32 Bit Zufälligkeit, neu generiert für jede ID.
d) Verwenden Sie für den einfachen Ausweg UUIDs / GUIDs .