🛠️

Whiz Tools

Build • Create • Innovate

Snowflake ID Generator voor Twitter en Gedistribueerde Systemen

Genereer en analyseer Twitter Snowflake ID's, unieke 64-bits identificatoren die worden gebruikt in gedistribueerde systemen. Deze tool stelt je in staat om nieuwe Snowflake ID's te maken en bestaande ID's te parseren, en biedt inzicht in hun tijdstempel, machine-ID en volgnummer componenten.

Snowflake ID Generator

Snowflake ID Generator

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

Documentatie

Snowflake ID Generator

Introductie

Een Snowflake ID is een unieke identificator die wordt gebruikt in gedistribueerde systemen, oorspronkelijk ontwikkeld door Twitter. Deze tool stelt je in staat om Snowflake IDs te genereren en te analyseren, die 64-bits gehele getallen zijn, samengesteld uit een tijdstempel, machine-ID en volgnummer.

Hoe Snowflake IDs Werken

Snowflake IDs zijn 64-bits gehele getallen die als volgt zijn gestructureerd:

  • 41 bits: Tijdstempel (milliseconden sinds een aangepaste epoch)
  • 10 bits: Machine-ID (5 bits voor datacenter-ID, 5 bits voor worker-ID)
  • 12 bits: Volgnummer

Deze structuur maakt het mogelijk om ongeveer 4.096 unieke IDs per milliseconde per machine te genereren.

Gebruik van de Snowflake ID Generator

  1. (Optioneel) Stel een aangepaste epoch in (standaard is de epoch van Twitter: 2010-11-04T01:42:54.657Z)
  2. Voer een machine-ID (0-31) en datacenter-ID (0-31) in
  3. Klik op "Genereren" om een nieuwe Snowflake ID te maken
  4. De gegenereerde ID en zijn componenten worden weergegeven

Om een bestaande Snowflake ID te parseren, voer deze in het veld "Parse ID" in en klik op "Parse".

Formule

De Snowflake ID wordt geconstrueerd met behulp van bitwise-operaties:

1ID = (tijdstempel << 22) | (datacenterId << 17) | (workerId << 12) | volgnummer
2

Waarbij:

  • tijdstempel het aantal milliseconden sinds de epoch is
  • datacenterId een 5-bits geheel getal is (0-31)
  • workerId een 5-bits geheel getal is (0-31)
  • volgnummer een 12-bits geheel getal is (0-4095)

Berekening

De Snowflake ID-generator voert de volgende stappen uit:

  1. Verkrijg de huidige tijdstempel in milliseconden
  2. Zorg ervoor dat de tijdstempel groter is dan de laatst gebruikte tijdstempel (voor uniciteit)
  3. Als de tijdstempel hetzelfde is als de laatste, verhoog het volgnummer
  4. Als het volgnummer overloopt (4096 bereikt), wacht dan op de volgende milliseconde
  5. Combineer de componenten met behulp van bitwise-operaties om de uiteindelijke ID te creëren

Toepassingen

Snowflake IDs zijn bijzonder nuttig in:

  1. Gedistribueerde Systemen: Genereer unieke IDs over meerdere machines zonder coördinatie
  2. Hoge Volumes Gegevens: Maak sorteerebare IDs voor grote datasets
  3. Microservices: Zorg voor unieke identificatoren tussen verschillende services
  4. Database Sharding: Gebruik de tijdstempel of machine-ID-component voor efficiënte sharding

Alternatieven

Hoewel Snowflake IDs krachtig zijn, omvatten andere ID-generatiesystemen:

  1. UUID (Universally Unique Identifier): Nuttig wanneer gedistribueerde generatie nodig is zonder sorteervolgorde
  2. Auto-incrementerende database-ID's: Eenvoudig maar beperkt tot enkele database-instanties
  3. ULID (Universally Unique Lexicographically Sortable Identifier): Vergelijkbaar met Snowflake, maar met een andere structuur

Randgevallen en Beperkingen

  1. Kloksynchronisatie: Snowflake IDs zijn afhankelijk van de systeemtijd. Als de klok terugloopt door NTP-aanpassingen of wijzigingen in de zomertijd, kan dit problemen veroorzaken bij de ID-generatie.

  2. Jaar 2038 Probleem: De 41-bits tijdstempel zal overlopen in 2079 (ervan uitgaande dat de Twitter-epoch wordt gebruikt). Systemen die Snowflake IDs gebruiken, moeten voor deze eventualiteit plannen.

  3. Machine-ID Botsingen: In grote gedistribueerde systemen kan het een uitdaging zijn om unieke machine-ID's te waarborgen en kan extra coördinatie vereisen.

  4. Volgnummer Overloop: In extreem hoge doorvoerscenario's is het mogelijk om de 4096 volgnummers per milliseconde uit te putten, wat mogelijk vertragingen veroorzaakt.

  5. Niet-monotonie Tussen Machines: Hoewel IDs monotonisch toenemen op een enkele machine, zijn ze mogelijk niet strikt monotonisch tussen meerdere machines.

Geschiedenis

Snowflake IDs werden in 2010 door Twitter geïntroduceerd om te voldoen aan de behoefte aan gedistribueerde, tijd-sortable unieke identificatoren. Ze zijn sindsdien door veel andere bedrijven en projecten overgenomen en aangepast.

Voorbeelden

Hier zijn implementaties van Snowflake ID-generators in verschillende talen:

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('Klok is teruggelopen. Weigeren om id te genereren');
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// Gebruik
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Gegenereerde Snowflake ID: ${id}`);
58

Diagram

Hier is een visuele weergave van de structuur van de Snowflake ID:

Tijdstempel (41 bits) Machine-ID (10 bits) Volgnummer (12 bits)

64-bits Snowflake ID Structuur

Referenties

  1. "Aankondiging Snowflake." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Gedistrubueerde ID-generatie in Microservices." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f