Open Source Highlight: UniqueIdGenerator
In verteilten Systemen ist das Erstellen eindeutiger IDs nicht ganz so einfach. Es muss nämlich sichergestellt werden, dass mehrere Maschinen nicht die gleiche ID vergeben. Die häufigsten Lösungen dafür ist die Verwendung von GUIDs oder dass die Datenbank die IDs generiert.
Beide Lösungen haben ihre Nachteile. Wenn die Datenbank die IDs generieren soll, hat man einen Single Point of Failure. Bei der Verwendung von GUIDs hat man den Nachteil, dass sie nicht sequenziell vergeben werden. Ausserdem kann man sich bei den allermeisten GUID Implementierungen nicht zu 100 Prozent sicher sein, dass die neu generierte GUID auch wirklich eindeutig ist.
Um diesem Problem zu begegnen hat Twitter die Bibliothek Snowflake als Open Source veröffentlicht. Basierend auf dieser Bibliothek habe ich für das .NET Framework die Bibliothek UniqueIdGenerator veröffentlicht.
UniqueIdGenerator erstellt IDs mit den folgenden Eigenschaften:
- 64 bit Zahl
- Eindeutig auch in verteilten Systemen
- Sequenziell
Und dies erst noch sehr schnell. Um dies zu erreichen, werden die 64bit aufgeteilt:
- 41 bits werden für den Timestamp verwendet
- 10 bits werden für die Maschinen ID verwendet
- 13 bits werden für die Sequenz verwendet
Dies ist die Standardkonfiguration, die selbstverständlich angepasst werden kann. Mit dieser Standardkonfiguration kann Ihre Software auf 1024 (2^10) verschiedenen Maschinen laufen, ohne dass sich die IDs gegenseitig in die Quere kommen.
Die ersten 41 bits werden für den Timestamp verwendet. Der Timestamp ist in diesem Fall die Anzahl Millisekunden seit Projektbeginn. Diesen Beginn können Sie frei wählen, er muss aber in der Vergangenheit liegen. Diese Limitierung auf 41 bit bedeutet, dass nach 2.2e12 Millisekunden Schluss ist. Das sind knapp 70 Jahre. In der Standardkonfiguration.
Die letzten 13 bits sorgen dafür, dass der Generator nicht nur eine einzige ID pro Millisekunde generieren kann, sondern 8192.
Zusammengefasst können Sie mit dem UniqueIdGenerator also während 70 Jahren auf 1024 verschiedenen Maschinen pro Millisekunde 8192 eindeutige IDs generieren.
Um die Bibliothek zu verwenden, installieren Sie sie ganz einfach via NuGet.
PM> Install-Package UniqueIdGenerator
Dann erstellen Sie den Generator mit der MachineId sowie der Startzeit.
var generator = new Generator(machineId, new DateTime(2015, 1, 1));
Der Generator stellt zwei Methoden zur Verfügung. NextLong()
gibt einen UInt64
zurück, Next()
einen String. Die Statische Hilfsklasse IdConverter
können Sie verwenden, um zwischen diesen beiden Resultaten hin- und her zu rechnen:
AACxgFbAEAA = 195164769357824
AAC3UcJAMAA = 201561779220480
AAC3a4sAMAA = 201672521428992
AADOCnOAEAA = 226544282767360
AAEQBrnAEAA = 299096048930816
AAESfkpAEAA = 301808597602304
AAETZ2AAEAA = 302809689886720
Ich hoffe, UniqueIdGenerator kann Ihnen in einem zukünftigen Projekt behilflich sein.