🛠️

Whiz Tools

Build • Create • Innovate

Snowflake-ID-Generator für verteilte Systeme und Analyse

Generieren und analysieren Sie Twitter Snowflake-IDs, einzigartige 64-Bit-Identifikatoren, die in verteilten Systemen verwendet werden. Dieses Tool ermöglicht es Ihnen, neue Snowflake-IDs zu erstellen und vorhandene zu analysieren, wobei Einblicke in ihre Zeitstempel-, Maschinen-ID- und Sequenznummern-Komponenten bereitgestellt werden.

Snowflake-ID-Generator

Snowflake-ID-Generator

Optional: Unix timestamp in milliseconds (defaults to current time)
📚

Dokumentation

Snowflake ID Generator

Einführung

Eine Snowflake-ID ist ein eindeutiger Identifikator, der in verteilten Systemen verwendet wird und ursprünglich von Twitter entwickelt wurde. Dieses Tool ermöglicht es Ihnen, Snowflake-IDs zu generieren und zu analysieren, die aus 64-Bit-Ganzzahlen bestehen, die aus einem Zeitstempel, einer Maschinen-ID und einer Sequenznummer zusammengesetzt sind.

Wie Snowflake-IDs funktionieren

Snowflake-IDs sind 64-Bit-Ganzzahlen, die wie folgt strukturiert sind:

  • 41 Bits: Zeitstempel (Millisekunden seit einer benutzerdefinierten Epoche)
  • 10 Bits: Maschinen-ID (5 Bits für die Rechenzentrums-ID, 5 Bits für die Worker-ID)
  • 12 Bits: Sequenznummer

Diese Struktur ermöglicht die Generierung von ungefähr 4.096 eindeutigen IDs pro Millisekunde pro Maschine.

Verwendung des Snowflake-ID-Generators

  1. (Optional) Setzen Sie eine benutzerdefinierte Epoche (Standard ist Twitters Epoche: 2010-11-04T01:42:54.657Z)
  2. Geben Sie eine Maschinen-ID (0-31) und eine Rechenzentrums-ID (0-31) ein
  3. Klicken Sie auf "Generieren", um eine neue Snowflake-ID zu erstellen
  4. Die generierte ID und ihre Komponenten werden angezeigt

Um eine vorhandene Snowflake-ID zu analysieren, geben Sie sie in das Feld "ID analysieren" ein und klicken Sie auf "Analysieren".

Formel

Die Snowflake-ID wird unter Verwendung von Bitoperationen konstruiert:

1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2

Wo:

  • timestamp die Anzahl der Millisekunden seit der Epoche ist
  • datacenterId eine 5-Bit-Ganzzahl (0-31) ist
  • workerId eine 5-Bit-Ganzzahl (0-31) ist
  • sequence eine 12-Bit-Ganzzahl (0-4095) ist

Berechnung

Der Snowflake-ID-Generator führt die folgenden Schritte aus:

  1. Holen Sie sich den aktuellen Zeitstempel in Millisekunden
  2. Stellen Sie sicher, dass der Zeitstempel größer ist als der zuletzt verwendete Zeitstempel (für Eindeutigkeit)
  3. Wenn der Zeitstempel derselbe ist wie der letzte, erhöhen Sie die Sequenznummer
  4. Wenn die Sequenznummer überläuft (4096 erreicht), warten Sie auf die nächste Millisekunde
  5. Kombinieren Sie die Komponenten mithilfe von Bitoperationen, um die endgültige ID zu erstellen

Anwendungsfälle

Snowflake-IDs sind besonders nützlich in:

  1. Verteilten Systemen: Generieren Sie eindeutige IDs über mehrere Maschinen hinweg ohne Koordination
  2. Hochvolumigen Daten: Erstellen Sie sortierbare IDs für große Datensätze
  3. Mikrodiensten: Stellen Sie sicher, dass eindeutige Identifikatoren über verschiedene Dienste hinweg vorhanden sind
  4. Datenbank-Sharding: Verwenden Sie die Zeitstempel- oder Maschinen-ID-Komponente für effizientes Sharding

Alternativen

Obwohl Snowflake-IDs leistungsstark sind, gibt es andere ID-Generierungssysteme, darunter:

  1. UUID (Universally Unique Identifier): Nützlich, wenn eine verteilte Generierung ohne Sortierbarkeit erforderlich ist
  2. Auto-incrementing-Datenbank-IDs: Einfach, aber auf einzelne Datenbankinstanzen beschränkt
  3. ULID (Universally Unique Lexicographically Sortable Identifier): Ähnlich wie Snowflake, jedoch mit einer anderen Struktur

Randfälle und Einschränkungen

  1. Uhrensynchronisation: Snowflake-IDs sind auf die Systemzeit angewiesen. Wenn die Uhr aufgrund von NTP-Anpassungen oder Änderungen der Sommerzeit zurückgesetzt wird, kann dies Probleme bei der ID-Generierung verursachen.

  2. Jahr-2038-Problem: Der 41-Bit-Zeitstempel wird 2079 überlaufen (vorausgesetzt, die Twitter-Epoche). Systeme, die Snowflake-IDs verwenden, sollten für diese Eventualität planen.

  3. Maschinen-ID-Kollisionen: In großen verteilten Systemen kann es eine Herausforderung sein, eindeutige Maschinen-IDs sicherzustellen, was möglicherweise zusätzliche Koordination erfordert.

  4. Sequenzüberlauf: In extrem hochdurchsatzfähigen Szenarien ist es möglich, die 4096 Sequenzen pro Millisekunde zu erschöpfen, was möglicherweise zu Verzögerungen führt.

  5. Nichtmonotonie über Maschinen hinweg: Während IDs auf einer einzelnen Maschine monoton ansteigend sind, sind sie möglicherweise nicht strikt monoton über mehrere Maschinen hinweg.

Geschichte

Snowflake-IDs wurden 2010 von Twitter eingeführt, um den Bedarf an verteilten, zeitlich sortierbaren eindeutigen Identifikatoren zu decken. Sie wurden seitdem von vielen anderen Unternehmen und Projekten übernommen und angepasst.

Beispiele

Hier sind Implementierungen von Snowflake-ID-Generatoren in verschiedenen Sprachen:

1class SnowflakeGenerator {
2  constructor(epoch = 1288834974657, datacenterIdBits = 5, workerIdBits = 5, sequenceBits = 12) {
3    this.epoch = BigInt(epoch);
4    this.datacenterIdBits = datacenterIdBits;
5    this.workerIdBits = workerIdBits;
6    this.sequenceBits = sequenceBits;
7    this.maxDatacenterId = -1n ^ (-1n << BigInt(datacenterIdBits));
8    this.maxWorkerId = -1n ^ (-1n << BigInt(workerIdBits));
9    this.sequenceMask = -1n ^ (-1n << BigInt(sequenceBits));
10    this.workerIdShift = BigInt(sequenceBits);
11    this.datacenterIdShift = BigInt(sequenceBits + workerIdBits);
12    this.timestampLeftShift = BigInt(sequenceBits + workerIdBits + datacenterIdBits);
13    this.sequence = 0n;
14    this.lastTimestamp = -1n;
15  }
16
17  nextId(datacenterId, workerId) {
18    let timestamp = this.currentTimestamp();
19
20    if (timestamp < this.lastTimestamp) {
21      throw new Error('Die Uhr ist zurückgegangen. ID-Generierung verweigert');
22    }
23
24    if (timestamp === this.lastTimestamp) {
25      this.sequence = (this.sequence + 1n) & this.sequenceMask;
26      if (this.sequence === 0n) {
27        timestamp = this.tilNextMillis(this.lastTimestamp);
28      }
29    } else {
30      this.sequence = 0n;
31    }
32
33    this.lastTimestamp = timestamp;
34
35    return ((timestamp - this.epoch) << this.timestampLeftShift) |
36           (BigInt(datacenterId) << this.datacenterIdShift) |
37           (BigInt(workerId) << this.workerIdShift) |
38           this.sequence;
39  }
40
41  tilNextMillis(lastTimestamp) {
42    let timestamp = this.currentTimestamp();
43    while (timestamp <= lastTimestamp) {
44      timestamp = this.currentTimestamp();
45    }
46    return timestamp;
47  }
48
49  currentTimestamp() {
50    return BigInt(Date.now());
51  }
52}
53
54// Verwendung
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generierte Snowflake-ID: ${id}`);
58

Diagramm

Hier ist eine visuelle Darstellung der Struktur der Snowflake-ID:

Zeitstempel (41 Bits) Maschinen-ID (10 Bits) Sequenz (12 Bits)

64-Bit Snowflake-ID-Struktur

Referenzen

  1. "Ankündigung von Snowflake." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake-ID." Wikipedia, https://de.wikipedia.org/wiki/Snowflake_ID
  3. "Verteilte ID-Generierung in Mikrodiensten." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f