🛠️

Whiz Tools

Build • Create • Innovate

Twitter Snowflake ID Generator for Distributed Systems

Generer og analyser Twitter Snowflake ID-er, unike 64-bit identifikatorer brukt i distribuerte systemer. Dette verktøyet lar deg opprette nye Snowflake ID-er og analysere eksisterende, og gir innsikt i deres tidsstempel, maskin-ID og sekvensnummerkomponenter.

Snowflake ID-generator

Snowflake ID-generator

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

Dokumentasjon

Snowflake ID Generator

Introduksjon

En Snowflake ID er en unik identifikator som brukes i distribuerte systemer, opprinnelig utviklet av Twitter. Dette verktøyet lar deg generere og analysere Snowflake ID-er, som er 64-biters heltall sammensatt av et tidsstempel, maskin-ID og sekvensnummer.

Hvordan Snowflake ID-er fungerer

Snowflake ID-er er 64-biters heltall strukturert som følger:

  • 41 biter: Tidsstempel (millisekunder siden en tilpasset epoke)
  • 10 biter: Maskin-ID (5 biter for datasenter-ID, 5 biter for arbeider-ID)
  • 12 biter: Sekvensnummer

Denne strukturen gjør det mulig å generere omtrent 4 096 unike ID-er per millisekund per maskin.

Bruke Snowflake ID Generator

  1. (Valgfritt) Sett en tilpasset epoke (standard er Twitters epoke: 2010-11-04T01:42:54.657Z)
  2. Skriv inn en maskin-ID (0-31) og datasenter-ID (0-31)
  3. Klikk "Generer" for å lage en ny Snowflake ID
  4. Den genererte ID-en og dens komponenter vil bli vist

For å analysere en eksisterende Snowflake ID, skriv den inn i feltet "Analyser ID" og klikk "Analyser".

Formel

Snowflake ID-en er konstruert ved hjelp av bitvise operasjoner:

1ID = (tidsstempel << 22) | (datasenterId << 17) | (arbeiderId << 12) | sekvens
2

Hvor:

  • tidsstempel er antall millisekunder siden epoken
  • datasenterId er et 5-biters heltall (0-31)
  • arbeiderId er et 5-biters heltall (0-31)
  • sekvens er et 12-biters heltall (0-4095)

Beregning

Snowflake ID-generatoren utfører følgende trinn:

  1. Hent det nåværende tidsstempelet i millisekunder
  2. Sørg for at tidsstempelet er større enn det sist brukte tidsstempelet (for unikhet)
  3. Hvis tidsstempelet er det samme som det forrige, øk sekvensnummeret
  4. Hvis sekvensnummeret går over (når 4096), vent på neste millisekund
  5. Kombiner komponentene ved hjelp av bitvise operasjoner for å lage den endelige ID-en

Bruksområder

Snowflake ID-er er spesielt nyttige i:

  1. Distribuerte systemer: Generere unike ID-er på tvers av flere maskiner uten koordinering
  2. Høyvolumdata: Opprette sorterbare ID-er for store datasett
  3. Mikrotjenester: Sikre unike identifikatorer på tvers av forskjellige tjenester
  4. Databaseshardering: Bruke tidsstempel- eller maskin-ID-komponenten for effektiv hardering

Alternativer

Selv om Snowflake ID-er er kraftige, inkluderer andre ID-genereringssystemer:

  1. UUID (Universally Unique Identifier): Nyttig når distribuerte generering er nødvendig uten sortering
  2. Auto-inkrementerende database-ID-er: Enkle, men begrenset til enkelt databaseinstanser
  3. ULID (Universally Unique Lexicographically Sortable Identifier): Ligner på Snowflake, men med en annen struktur

Edge Cases og Begrensninger

  1. Klokkesynkronisering: Snowflake ID-er er avhengige av systemtiden. Hvis klokken går tilbake på grunn av NTP-justeringer eller endringer i sommertid, kan det forårsake problemer med ID-generering.

  2. År 2038-problemet: Det 41-bits tidsstempelet vil overflyte i 2079 (forutsatt Twitters epoke). Systemer som bruker Snowflake ID-er bør planlegge for denne eventualiteten.

  3. Maskin-ID-kollisjoner: I store distribuerte systemer kan det være utfordrende å sikre unike maskin-ID-er og kan kreve ytterligere koordinering.

  4. Sekvensoverløp: I ekstremt høy gjennomstrømning kan det være mulig å tømme de 4096 sekvensene per millisekund, noe som potensielt kan forårsake forsinkelser.

  5. Ikke-monotonitet på tvers av maskiner: Selv om ID-er øker monotonisk på en enkelt maskin, kan de ikke være strengt monotone på tvers av flere maskiner.

Historie

Snowflake ID-er ble introdusert av Twitter i 2010 for å møte behovet for distribuerte, tids-sorterbare unike identifikatorer. De har siden blitt adoptert og tilpasset av mange andre selskaper og prosjekter.

Eksempler

Her er implementeringer av Snowflake ID-generatorer i forskjellige språk:

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 har flyttet seg bakover. Nekter å 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// Bruk
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generert Snowflake ID: ${id}`);
58

Diagram

Her er en visuell representasjon av Snowflake ID-strukturen:

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

64-biters Snowflake ID-struktur

Referanser

  1. "Kunngjøring av Snowflake." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Wikipedia, https://no.wikipedia.org/wiki/Snowflake_ID
  3. "Distribuert ID-generering i mikrotjenester." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f