🛠️

Whiz Tools

Build • Create • Innovate

Snowflake ID Generator for Twitter and Distributed Systems

Generera och analysera Twitter Snowflake-ID:n, unika 64-bitarsidentifierare som används i distribuerade system. Det här verktyget låter dig skapa nya Snowflake-ID:n och tolka befintliga, vilket ger insikter om deras tidsstämpel, maskin-ID och sekvensnummerkomponenter.

Snowflake ID-generator

Snowflake ID-generator

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

Dokumentation

Snowflake ID Generator

Introduktion

Ett Snowflake-ID är en unik identifierare som används i distribuerade system, ursprungligen utvecklad av Twitter. Det här verktyget gör det möjligt att generera och analysera Snowflake-ID:n, som är 64-bitars heltal som består av en tidsstämpel, maskin-ID och sekvensnummer.

Hur Snowflake-ID:n fungerar

Snowflake-ID:n är 64-bitars heltal som är strukturerade på följande sätt:

  • 41 bitar: Tidsstämpel (millisekunder sedan en anpassad epok)
  • 10 bitar: Maskin-ID (5 bitar för datacenter-ID, 5 bitar för arbetare-ID)
  • 12 bitar: Sekvensnummer

Denna struktur möjliggör generering av cirka 4 096 unika ID:n per millisekund per maskin.

Använda Snowflake-ID-generatorn

  1. (Valfritt) Ställ in en anpassad epok (standard är Twitters epok: 2010-11-04T01:42:54.657Z)
  2. Ange ett maskin-ID (0-31) och datacenter-ID (0-31)
  3. Klicka på "Generera" för att skapa ett nytt Snowflake-ID
  4. Det genererade ID:t och dess komponenter kommer att visas

För att analysera ett befintligt Snowflake-ID, skriv in det i fältet "Analysera ID" och klicka på "Analysera".

Formel

Snowflake-ID:t konstrueras med hjälp av bitoperationer:

1ID = (tidsstämpel << 22) | (datacenterId << 17) | (arbetareId << 12) | sekvens
2

Där:

  • tidsstämpel är antalet millisekunder sedan epoken
  • datacenterId är ett 5-bitars heltal (0-31)
  • arbetareId är ett 5-bitars heltal (0-31)
  • sekvens är ett 12-bitars heltal (0-4095)

Beräkning

Snowflake-ID-generatorn utför följande steg:

  1. Hämta den aktuella tidsstämpeln i millisekunder
  2. Säkerställ att tidsstämpeln är större än den senast använda tidsstämpeln (för unikhet)
  3. Om tidsstämpeln är densamma som den senaste, öka sekvensnumret
  4. Om sekvensnumret överflödar (når 4096), vänta på nästa millisekund
  5. Kombinera komponenterna med hjälp av bitoperationer för att skapa det slutliga ID:t

Användningsfall

Snowflake-ID:n är särskilt användbara i:

  1. Distribuerade system: Generera unika ID:n över flera maskiner utan samordning
  2. Högvolymdata: Skapa sorteringsbara ID:n för stora dataset
  3. Mikrotjänster: Säkerställ unika identifierare över olika tjänster
  4. Databassharding: Använd tidsstämpel- eller maskin-ID-komponenten för effektiv sharding

Alternativ

Även om Snowflake-ID:n är kraftfulla, inkluderar andra ID-genereringssystem:

  1. UUID (Universellt unikt identifierare): Användbart när distribuerad generation behövs utan sorterbarhet
  2. Auto-incrementing databas-ID:n: Enkla men begränsade till enstaka databasinstanser
  3. ULID (Universellt unikt lexikografiskt sorterat identifierare): Liknande Snowflake, men med en annan struktur

Gränsfall och begränsningar

  1. Klocksynkronisering: Snowflake-ID:n är beroende av systemtiden. Om klockan rör sig bakåt på grund av NTP-justeringar eller förändringar i sommartid kan det orsaka problem med ID-generering.

  2. År 2038-problemet: Den 41-bitars tidsstämpeln kommer att överflöda år 2079 (förutsatt Twitters epok). System som använder Snowflake-ID:n bör planera för denna eventualitet.

  3. Maskin-ID-kollisioner: I stora distribuerade system kan det vara en utmaning att säkerställa unika maskin-ID:n och kan kräva ytterligare samordning.

  4. Sekvensöverflöd: I extremt hög genomströmning kan det vara möjligt att uttömma de 4096 sekvenserna per millisekund, vilket potentiellt orsakar förseningar.

  5. Icke-monotonitet över maskiner: Även om ID:n är monotoniskt ökande på en enda maskin, kan de inte vara strikt monotona över flera maskiner.

Historia

Snowflake-ID:n introducerades av Twitter 2010 för att möta behovet av distribuerade, tids-sorterbara unika identifierare. De har sedan dess antagits och anpassats av många andra företag och projekt.

Exempel

Här är implementationer av Snowflake-ID-generatorer i olika 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('Klockan har rört sig bakåt. Vägrar att generera 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// Användning
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Genererat Snowflake-ID: ${id}`);
58

Diagram

Här är en visuell representation av Snowflake-ID-strukturen:

Tidsstämpel (41 bitar) Maskin-ID (10 bitar) Sekvens (12 bitar)

64-bitars Snowflake-ID-struktur

Referenser

  1. "Announcing 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. "Distribuerad ID-generering i mikrotjänster." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f