🛠️

Whiz Tools

Build • Create • Innovate

Ustvarite in analizirajte Snowflake ID-je za Twitter

Generirajte in analizirajte Twitter Snowflake ID-je, edinstvene 64-bitne identifikatorje, uporabljene v distribuiranih sistemih. Ta orodje vam omogoča ustvarjanje novih Snowflake ID-jev in razčlenjevanje obstoječih, kar zagotavlja vpoglede v njihove komponente časovnega žiga, ID-ja naprave in zaporedne številke.

Generator ID-jev Snowflake

Generator ID-jev Snowflake

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

Dokumentacija

Generátor ID-jev Snowflake

Uvod

ID-ji Snowflake so edinstveni identifikatorji, ki se uporabljajo v distribuiranih sistemih, prvotno jih je razvila Twitter. Ta orodja omogočajo generiranje in analizo ID-jev Snowflake, ki so 64-bitni celi števili, sestavljeni iz časovne oznake, ID-ja naprave in zaporedne številke.

Kako delujejo ID-ji Snowflake

ID-ji Snowflake so 64-bitni celi števili, strukturirani na naslednji način:

  • 41 bitov: Časovna oznaka (milisekunde od prilagojenega začetka)
  • 10 bitov: ID naprave (5 bitov za ID podatkovnega centra, 5 bitov za ID delavca)
  • 12 bitov: Zaporedna številka

Ta struktura omogoča generiranje približno 4.096 edinstvenih ID-jev na milisekundo na napravo.

Uporaba generátorja ID-jev Snowflake

  1. (Neobvezno) Nastavite prilagojen začetek (privzeto je Twitterjev začetek: 2010-11-04T01:42:54.657Z)
  2. Vnesite ID naprave (0-31) in ID podatkovnega centra (0-31)
  3. Kliknite "Generiraj", da ustvarite nov ID Snowflake
  4. Ustvarjeni ID in njegove komponente bodo prikazane

Za razčlenitev obstoječega ID-ja Snowflake ga vnesite v polje "Razčleni ID" in kliknite "Razčleni".

Formula

ID Snowflake se sestavi z uporabo bitovih operacij:

1ID = (časovna_označka << 22) | (ID_podatkovnega_centra << 17) | (ID_delavca << 12) | zaporedna_številka
2

Kjer:

  • časovna_označka je število milisekund od začetka
  • ID_podatkovnega_centra je 5-bitno celo število (0-31)
  • ID_delavca je 5-bitno celo število (0-31)
  • zaporedna_številka je 12-bitno celo število (0-4095)

Izračun

Generátor ID-jev Snowflake izvaja naslednje korake:

  1. Pridobi trenutno časovno oznako v milisekundah
  2. Preveri, ali je časovna oznaka večja od zadnje uporabljene časovne oznake (za edinstvenost)
  3. Če je časovna oznaka enaka zadnji, poveča zaporedno številko
  4. Če zaporedna številka preide (doseže 4096), počaka na naslednjo milisekundo
  5. Združi komponente z uporabo bitovih operacij, da ustvari končni ID

Uporabniški primeri

ID-ji Snowflake so še posebej uporabni v:

  1. Distribuiranih sistemih: Generiranje edinstvenih ID-jev na več napravah brez usklajevanja
  2. Visoko obsežnih podatkih: Ustvarjanje razvrstljivih ID-jev za velike nize podatkov
  3. Mikrostoritvah: Zagotavljanje edinstvenih identifikatorjev med različnimi storitvami
  4. Razdeljevanju podatkovnih baz: Uporaba komponente časovne oznake ali ID-ja naprave za učinkovito razdeljevanje

Alternativne rešitve

Čeprav so ID-ji Snowflake močni, vključujejo drugi sistemi za generiranje ID-jev:

  1. UUID (Univerzalni edinstveni identifikator): Uporaben, kadar je potrebna distribuirana generacija brez razvrščanja
  2. Samodejno povečevanje ID-jev v podatkovni bazi: Preprosto, a omejeno na posamezne primere podatkovnih baz
  3. ULID (Univerzalni edinstveni lexikografsko razvrščljiv identifikator): Podoben Snowflake, vendar z drugačno strukturo

Robne primere in omejitve

  1. Sinhronizacija ure: ID-ji Snowflake se zanašajo na sistemski čas. Če se ura premakne nazaj zaradi prilagoditev NTP ali sprememb poletnega časa, lahko to povzroči težave pri generaciji ID-jev.

  2. Problem leta 2038: 41-bitna časovna oznaka se bo presegla leta 2079 (ob predpostavki Twitterjevega začetka). Sistemi, ki uporabljajo ID-je Snowflake, bi se morali pripraviti na to.

  3. Kolizije ID-jev naprav: V velikih distribuiranih sistemih je zagotavljanje edinstvenih ID-jev naprav lahko izziv in lahko zahteva dodatno usklajevanje.

  4. Prelivanje zaporedja: V izjemno visokih scenarijih obremenitve je mogoče izčrpati 4096 zaporedij na milisekundo, kar lahko povzroči zamude.

  5. Ne-monotonost med napravami: Medtem ko so ID-ji monotono naraščajoči na eni napravi, morda ne bodo strogo monotoni med več napravami.

Zgodovina

ID-ji Snowflake so bili predstavljeni s strani Twitterja leta 2010, da bi zadovoljili potrebo po distribuiranih, časovno razvrščenih edinstvenih identifikatorjih. Od takrat so jih sprejele in prilagodile številne druge družbe in projekti.

Primeri

Tukaj so implementacije generátorjev ID-jev Snowflake v različnih jezikih:

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('Ura se je premaknila nazaj. Odklanjam generacijo 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// Uporaba
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Ustvarjen ID Snowflake: ${id}`);
58

Diagram

Tukaj je vizualna predstavitev strukture ID-ja Snowflake:

Časovna oznaka (41 bitov) ID naprave (10 bitov) Zaporedna številka (12 bitov)

Struktura ID-ja Snowflake (64 bita)

Reference

  1. "Napovedujemo Snowflake." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID Snowflake." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Distribuirana generacija ID-jev v mikrostoritvah." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f