🛠️

Whiz Tools

Build • Create • Innovate

Snowflake ID Generator for Twitter: Create and Analyze IDs

Generujte a analyzujte ID Snowflake z Twitteru, jedinečné 64-bitové identifikátory používané v distribuovaných systémoch. Tento nástroj vám umožňuje vytvárať nové ID Snowflake a analyzovať existujúce, pričom poskytuje prehľad o ich časovej pečiatke, ID stroja a sekvenčnom čísle.

Generátor ID snehovej vločky

Generátor ID snehovej vločky

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

Dokumentácia

Generátor ID Snowflake

Úvod

ID Snowflake je jedinečný identifikátor používaný v distribuovaných systémoch, pôvodne vyvinutý spoločnosťou Twitter. Tento nástroj vám umožňuje generovať a analyzovať ID Snowflake, ktoré sú 64-bitové celé čísla zložené z časovej pečiatky, ID stroja a sekvenčného čísla.

Ako fungujú ID Snowflake

ID Snowflake sú 64-bitové celé čísla štruktúrované nasledovne:

  • 41 bitov: Časová pečiatka (milisekundy od vlastnej epochy)
  • 10 bitov: ID stroja (5 bitov pre ID dátového centra, 5 bitov pre ID pracovníka)
  • 12 bitov: Sekvenčné číslo

Táto štruktúra umožňuje generovanie približne 4 096 jedinečných ID za milisekundu na stroj.

Používanie generátora ID Snowflake

  1. (Voliteľné) Nastavte vlastnú epochu (predvolená je epocha Twitteru: 2010-11-04T01:42:54.657Z)
  2. Zadajte ID stroja (0-31) a ID dátového centra (0-31)
  3. Kliknite na "Generovať", aby ste vytvorili nové ID Snowflake
  4. Vygenerované ID a jeho komponenty sa zobrazia

Ak chcete analyzovať existujúce ID Snowflake, zadajte ho do poľa "Analyzovať ID" a kliknite na "Analyzovať".

Formula

ID Snowflake je konštruované pomocou bitových operácií:

1ID = (časová pečiatka << 22) | (ID dátového centra << 17) | (ID pracovníka << 12) | sekvencia
2

Kde:

  • časová pečiatka je počet milisekúnd od epochy
  • ID dátového centra je 5-bitové celé číslo (0-31)
  • ID pracovníka je 5-bitové celé číslo (0-31)
  • sekvencia je 12-bitové celé číslo (0-4095)

Výpočet

Generátor ID Snowflake vykonáva nasledujúce kroky:

  1. Získa aktuálnu časovú pečiatku v milisekundách
  2. Zabezpečí, že časová pečiatka je väčšia ako posledná použitá časová pečiatka (pre jedinečnosť)
  3. Ak je časová pečiatka rovnaká ako posledná, inkrementuje sekvenčné číslo
  4. Ak sekvenčné číslo pretečie (dosiahne 4096), čaká na nasledujúcu milisekundu
  5. Kombinuje komponenty pomocou bitových operácií na vytvorenie konečného ID

Použitie

ID Snowflake sú obzvlášť užitočné v:

  1. Distribuovaných systémoch: Generovanie jedinečných ID naprieč viacerými strojmi bez koordinácie
  2. Vysokofrekvenčných dátach: Vytváranie zoraditeľných ID pre veľké súbory údajov
  3. Mikroslužbách: Zabezpečenie jedinečných identifikátorov naprieč rôznymi službami
  4. Rozdelení databáz: Použitie komponentu časovej pečiatky alebo ID stroja pre efektívne rozdelenie

Alternatívy

Aj keď sú ID Snowflake mocné, iné systémy generovania ID zahŕňajú:

  1. UUID (Univerzálne jedinečné identifikátory): Užitečné, keď je potrebná distribuovaná generácia bez zoraditeľnosti
  2. Automaticky inkrementované ID databázy: Jednoduché, ale obmedzené na jednotlivé databázové inštancie
  3. ULID (Univerzálne jedinečné lexikograficky zoraditeľné identifikátory): Podobné ako Snowflake, ale s inou štruktúrou

Okrajové prípady a obmedzenia

  1. Synchronizácia hodín: ID Snowflake sa spoliehajú na systémový čas. Ak sa hodiny posunú späť kvôli úpravám NTP alebo zmenám času letného času, môže to spôsobiť problémy s generovaním ID.

  2. Problém roku 2038: 41-bitová časová pečiatka pretečie v roku 2079 (za predpokladu Twitterovej epochy). Systémy používajúce ID Snowflake by sa mali pripraviť na túto eventualitu.

  3. Kolízie ID stroja: V veľkých distribuovaných systémoch môže byť zabezpečenie jedinečných ID stroja náročné a môže vyžadovať dodatočnú koordináciu.

  4. Pretečenie sekvencie: V extrémne vysokofrekvenčných scenároch je možné vyčerpať 4096 sekvencií za milisekundu, čo môže potenciálne spôsobiť oneskorenia.

  5. Nemonotonickosť naprieč strojmi: Aj keď sú ID monotónne zvyšujúce sa na jednom stroji, nemusia byť striktne monotónne naprieč viacerými strojmi.

História

ID Snowflake boli predstavené spoločnosťou Twitter v roku 2010 na riešenie potreby distribuovaných, časovo zoraditeľných jedinečných identifikátorov. Odvtedy ich prijalo a prispôsobilo mnoho ďalších spoločností a projektov.

Príklady

Tu sú implementácie generátorov ID Snowflake v rôznych jazykoch:

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 sa posunuli späť. Odmietam generovať 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žitie
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Vygenerované ID Snowflake: ${id}`);
58

Diagram

Tu je vizuálne znázornenie štruktúry ID Snowflake:

Časová pečiatka (41 bitov) ID stroja (10 bitov) Sekvencia (12 bitov)

Štruktúra 64-bitového ID Snowflake

Odkazy

  1. "Oznamujeme Snowflake." Blog inžinierstva 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á generácia ID v mikroslužbách." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f