🛠️

Whiz Tools

Build • Create • Innovate

Generátor ID sněhové vločky pro distribuované systémy

Generujte a analyzujte ID sněhové vločky Twitteru, jedinečné 64bitové identifikátory používané v distribuovaných systémech. Tento nástroj vám umožňuje vytvářet nová ID sněhové vločky a analyzovat existující, poskytující přehled o jejich časovém razítku, ID stroje a čísle sekvence.

Generátor ID sněhové vločky

Generátor ID sněhové vločky

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

Dokumentace

Generátor ID Snowflake

Úvod

ID Snowflake je unikátní identifikátor používaný v distribuovaných systémech, původně vyvinutý Twitterem. Tento nástroj vám umožňuje generovat a analyzovat ID Snowflake, která jsou 64bitovými celými čísly složenými z časového razítka, ID stroje a čísla sekvence.

Jak fungují ID Snowflake

ID Snowflake jsou 64bitová celá čísla strukturovaná takto:

  • 41 bitů: Časové razítko (milisekundy od vlastního epoch)
  • 10 bitů: ID stroje (5 bitů pro ID datového centra, 5 bitů pro ID pracovníka)
  • 12 bitů: Číslo sekvence

Tato struktura umožňuje generování přibližně 4 096 unikátních ID za milisekundu na stroj.

Použití generátoru ID Snowflake

  1. (Volitelné) Nastavte vlastní epochu (výchozí je epoch Twitteru: 2010-11-04T01:42:54.657Z)
  2. Zadejte ID stroje (0-31) a ID datového centra (0-31)
  3. Klikněte na "Generovat" pro vytvoření nového ID Snowflake
  4. Vygenerované ID a jeho komponenty budou zobrazeny

Pro analýzu existujícího ID Snowflake jej zadejte do pole "Analyzovat ID" a klikněte na "Analyzovat".

Vzorec

ID Snowflake je konstruováno pomocí bitových operací:

1ID = (časové razítko << 22) | (ID datového centra << 17) | (ID pracovníka << 12) | sekvence
2

Kde:

  • časové razítko je počet milisekund od epochy
  • ID datového centra je 5bitové celé číslo (0-31)
  • ID pracovníka je 5bitové celé číslo (0-31)
  • sekvence je 12bitové celé číslo (0-4095)

Výpočet

Generátor ID Snowflake provádí následující kroky:

  1. Získejte aktuální časové razítko v milisekundách
  2. Zajistěte, aby časové razítko bylo větší než poslední použité časové razítko (pro unikátnost)
  3. Pokud je časové razítko stejné jako poslední, inkrementujte číslo sekvence
  4. Pokud číslo sekvence překročí (dosáhne 4096), počkejte na další milisekundu
  5. Kombinujte komponenty pomocí bitových operací pro vytvoření konečného ID

Případ použití

ID Snowflake jsou zvláště užitečné v:

  1. Distribuovaných systémech: Generování unikátních ID napříč více stroji bez koordinace
  2. Vysokém objemu dat: Vytváření třídících ID pro velké datové sady
  3. Mikroslužbách: Zajištění unikátních identifikátorů napříč různými službami
  4. Šardování databáze: Použití komponenty časového razítka nebo ID stroje pro efektivní šardování

Alternativy

I když jsou ID Snowflake mocné, jiné systémy generování ID zahrnují:

  1. UUID (Univerzálně unikátní identifikátor): Užitečné, když je potřeba distribuovaná generace bez třídění
  2. Automaticky inkrementující ID databáze: Jednoduché, ale omezené na jednotlivé instance databáze
  3. ULID (Univerzálně unikátní lexikograficky tříděný identifikátor): Podobné Snowflake, ale s jinou strukturou

Hraniční případy a omezení

  1. Synchronizace hodin: ID Snowflake závisí na systémovém čase. Pokud se hodiny vrátí zpět kvůli úpravám NTP nebo změnám letního času, může to způsobit problémy s generováním ID.

  2. Problém roku 2038: 41bitové časové razítko přeteče v roce 2079 (předpokládající epochu Twitteru). Systémy používající ID Snowflake by měly plánovat na tuto eventualitu.

  3. Kolize ID stroje: V rozsáhlých distribuovaných systémech může být zajištění unikátních ID strojů náročné a může vyžadovat další koordinaci.

  4. Přetečení sekvence: V extrémně vysokoprůtokových scénářích je možné vyčerpat 4096 sekvencí za milisekundu, což může potenciálně způsobit zpoždění.

  5. Nemonotonie napříč stroji: I když jsou ID monotonicky rostoucí na jednom stroji, nemusí být striktně monotonic napříč více stroji.

Historie

ID Snowflake byla představena Twitterem v roce 2010, aby vyřešila potřebu distribuovaných, časově tříděných unikátních identifikátorů. Od té doby byla přijata a přizpůsobena mnoha dalšími společnostmi a projekty.

Příklady

Zde jsou implementace generátorů ID Snowflake v různých jazycích:

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('Hodiny se posunuly zpět. Odmítám generovat 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// Použití
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Vygenerované ID Snowflake: ${id}`);
58

Diagram

Zde je vizuální reprezentace struktury ID Snowflake:

Časové razítko (41 bitů) ID stroje (10 bitů) Sekvence (12 bitů)

Struktura ID Snowflake (64 bitů)

Odkazy

  1. "Oznámení Snowflake." Blog inženýrství Twitteru, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID Snowflake." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Distribuovaná generace ID v mikroslužbách." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f