🛠️

Whiz Tools

Build • Create • Innovate

Snowflake ID Generator for Twitter: Create and Analyze IDs

Generer og analyser Twitter Snowflake IDs, unikke 64-bit identifikatorer, der bruges i distribuerede systemer. Dette værktøj giver dig mulighed for at oprette nye Snowflake IDs og analysere eksisterende, hvilket giver indsigt i deres tidsstempel, maskin-ID og sekvensnummer komponenter.

Snowflake ID-generator

Snowflake ID-generator

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

Dokumentation

Snowflake ID Generator

Introduktion

En Snowflake ID er en unik identifikator, der bruges i distribuerede systemer, oprindeligt udviklet af Twitter. Dette værktøj giver dig mulighed for at generere og analysere Snowflake IDs, som er 64-bit heltal sammensat af et tidsstempel, maskin-ID og sekvensnummer.

Hvordan Snowflake IDs fungerer

Snowflake IDs er 64-bit heltal struktureret som følger:

  • 41 bits: Tidsstempel (millisekunder siden en brugerdefineret epoch)
  • 10 bits: Maskin-ID (5 bits til datacenter-ID, 5 bits til arbejdere-ID)
  • 12 bits: Sekvensnummer

Denne struktur muliggør generering af cirka 4.096 unikke IDs pr. millisekund pr. maskine.

Brug af Snowflake ID Generator

  1. (Valgfrit) Indstil en brugerdefineret epoch (standard er Twitters epoch: 2010-11-04T01:42:54.657Z)
  2. Indtast et maskin-ID (0-31) og datacenter-ID (0-31)
  3. Klik på "Generer" for at oprette en ny Snowflake ID
  4. Den genererede ID og dens komponenter vises

For at analysere en eksisterende Snowflake ID, indtast den i feltet "Parse ID" og klik på "Parse".

Formel

Snowflake ID'en konstrueres ved hjælp af bitvise operationer:

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

Hvor:

  • timestamp er antallet af millisekunder siden epoch
  • datacenterId er et 5-bit heltal (0-31)
  • workerId er et 5-bit heltal (0-31)
  • sequence er et 12-bit heltal (0-4095)

Beregning

Snowflake ID generatoren udfører følgende trin:

  1. Få det aktuelle tidsstempel i millisekunder
  2. Sørg for, at tidsstemplet er større end det sidst brugte tidsstempel (for unikhed)
  3. Hvis tidsstemplet er det samme som det sidste, skal sekvensnummeret inkrementeres
  4. Hvis sekvensnummeret løber over (når 4096), skal der ventes på det næste millisekund
  5. Kombiner komponenterne ved hjælp af bitvise operationer for at skabe den endelige ID

Anvendelsessager

Snowflake IDs er særligt nyttige i:

  1. Distribuerede systemer: Generere unikke IDs på tværs af flere maskiner uden koordinering
  2. Højvolumen data: Oprette sorterbare IDs til store datasæt
  3. Mikrotjenester: Sikre unikke identifikatorer på tværs af forskellige tjenester
  4. Database sharding: Brug tidsstempel- eller maskin-ID-komponenten til effektiv sharding

Alternativer

Mens Snowflake IDs er kraftfulde, inkluderer andre ID-genereringssystemer:

  1. UUID (Universally Unique Identifier): Nyttig når distribueret generation er nødvendig uden sortering
  2. Auto-inkrementerende database IDs: Simpel, men begrænset til enkelt databaseinstanser
  3. ULID (Universally Unique Lexicographically Sortable Identifier): Ligner Snowflake, men med en anden struktur

Grænsetilfælde og begrænsninger

  1. Klokkesynkronisering: Snowflake IDs er afhængige af systemtiden. Hvis klokken bevæger sig bagud på grund af NTP-justeringer eller ændringer i sommertid, kan det forårsage problemer med ID-generering.

  2. År 2038-problemet: Det 41-bit tidsstempel vil overflyde i 2079 (forudsat Twitters epoch). Systemer, der bruger Snowflake IDs, bør planlægge for denne eventualitet.

  3. Maskin-ID-kollisioner: I store distribuerede systemer kan det være udfordrende at sikre unikke maskin-ID'er og kan kræve yderligere koordinering.

  4. Sekvensoverløb: I ekstremt høj gennemstrømning kan det være muligt at udtømme de 4096 sekvenser pr. millisekund, hvilket potentielt kan forårsage forsinkelser.

  5. Ikke-monotonitet på tværs af maskiner: Selvom IDs er monotonisk stigende på en enkelt maskine, er de muligvis ikke strengt monotone på tværs af flere maskiner.

Historie

Snowflake IDs blev introduceret af Twitter i 2010 for at imødekomme behovet for distribuerede, tids-sorterbare unikke identifikatorer. De er siden blevet vedtaget og tilpasset af mange andre virksomheder og projekter.

Eksempler

Her er implementeringer af Snowflake ID-generatorer i forskellige sprog:

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('Klokken bevægede sig bagud. Nægter at generere id');
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// Brug
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Genereret Snowflake ID: ${id}`);
58

Diagram

Her er en visuel repræsentation af Snowflake ID-strukturen:

Tidsstempel (41 bits) Maskin-ID (10 bits) Sekvens (12 bits)

64-bit Snowflake ID Struktur

Referencer

  1. "Annoncering af 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. "Distribueret ID-generering i mikrotjenester." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f