🛠️

Whiz Tools

Build • Create • Innovate

Generišite i analizirajte Snowflake ID-ove za Twitter

Generišite i analizirajte Twitter Snowflake ID-ove, jedinstvene 64-bitne identifikatore korišćene u distribuiranim sistemima. Ovaj alat vam omogućava da kreirate nove Snowflake ID-ove i analizirate postojeće, pružajući uvide u njihove komponente kao što su vremenska oznaka, ID mašine i broj sekvence.

Generator ID-a snežnih pahulja

Generator ID-a snežnih pahulja

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

Dokumentacija

Snowflake ID Generator

Uvod

Snowflake ID je jedinstveni identifikator koji se koristi u distribuiranim sistemima, prvobitno razvijen od strane Twitter-a. Ovaj alat vam omogućava da generišete i analizirate Snowflake ID-ove, koji su 64-bitni celobrojni brojevi sastavljeni od vremenskog oznake, ID-a mašine i broja sekvence.

Kako Snowflake ID-ovi funkcionišu

Snowflake ID-ovi su 64-bitni celobrojni brojevi strukturirani na sledeći način:

  • 41 bit: Vremenska oznaka (milisekunde od prilagođene epohe)
  • 10 bita: ID mašine (5 bita za ID podatkovnog centra, 5 bita za ID radnika)
  • 12 bita: Broj sekvence

Ova struktura omogućava generisanje približno 4,096 jedinstvenih ID-ova po milisekundi po mašini.

Korišćenje Snowflake ID Generator-a

  1. (Opcionalno) Postavite prilagođenu epohu (podrazumevana je Twitter-ova epoha: 2010-11-04T01:42:54.657Z)
  2. Unesite ID mašine (0-31) i ID podatkovnog centra (0-31)
  3. Kliknite na "Generiši" da biste kreirali novi Snowflake ID
  4. Generisani ID i njegovi sastavni delovi biće prikazani

Da biste analizirali postojeći Snowflake ID, unesite ga u polje "Analiziraj ID" i kliknite na "Analiziraj".

Formula

Snowflake ID se konstruira korišćenjem bitovskih operacija:

1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2

Gde:

  • timestamp je broj milisekundi od epohe
  • datacenterId je 5-bitni celobroj (0-31)
  • workerId je 5-bitni celobroj (0-31)
  • sequence je 12-bitni celobroj (0-4095)

Izračunavanje

Generator Snowflake ID-a obavlja sledeće korake:

  1. Uzmite trenutnu vremensku oznaku u milisekundama
  2. Osigurajte da je vremenska oznaka veća od poslednje korišćene vremenske oznake (radi jedinstvenosti)
  3. Ako je vremenska oznaka ista kao poslednja, inkrementirajte broj sekvence
  4. Ako broj sekvence pređe granicu (dođe do 4096), sačekajte sledeću milisekundu
  5. Kombinujte komponente koristeći bitovske operacije da biste kreirali konačni ID

Upotreba

Snowflake ID-ovi su posebno korisni u:

  1. Distribuiranim sistemima: Generišite jedinstvene ID-ove širom više mašina bez koordinacije
  2. Podacima velikog obima: Kreirajte sortirane ID-ove za velike skupove podataka
  3. Mikrouslugama: Osigurajte jedinstvene identifikatore širom različitih usluga
  4. Deljenju baze podataka: Koristite komponentu vremenske oznake ili ID-a mašine za efikasno deljenje

Alternativa

Iako su Snowflake ID-ovi moćni, drugi sistemi generisanja ID-a uključuju:

  1. UUID (Univerzalni jedinstveni identifikator): Koristan kada je potrebna distribuirana generacija bez sortiranja
  2. Auto-incrementing ID-ovi baze podataka: Jednostavni, ali ograničeni na jedinstvene instance baze podataka
  3. ULID (Univerzalni jedinstveni leksikografski sortirani identifikator): Sličan Snowflake-u, ali sa drugačijom strukturom

Ograničenja i ivice slučajeva

  1. Sinhronizacija sata: Snowflake ID-ovi se oslanjaju na sistemsko vreme. Ako se sat pomeri unazad zbog NTP podešavanja ili promena vremena, može doći do problema sa generacijom ID-a.

  2. Problem 2038. godine: 41-bitna vremenska oznaka će preći granicu 2079. (pod pretpostavkom Twitter-ove epohe). Sistemi koji koriste Snowflake ID-ove treba da planiraju za ovu eventualnost.

  3. Sudari ID-a mašine: U velikim distribuiranim sistemima, osiguranje jedinstvenih ID-a mašine može biti izazovno i može zahtevati dodatnu koordinaciju.

  4. Preopterećenje sekvence: U ekstremno visokim scenarijima, moguće je iscrpiti 4096 sekvenci po milisekundi, što može izazvati kašnjenja.

  5. Ne-monotonija između mašina: Iako su ID-ovi monotonijski rastući na jednoj mašini, možda neće biti strogo monotoni između više mašina.

Istorija

Snowflake ID-ovi su predstavljeni od strane Twitter-a 2010. godine kako bi se zadovoljila potreba za distribuiranim, vremenski sortabilnim jedinstvenim identifikatorima. Od tada su ih usvojile i prilagodile mnoge druge kompanije i projekti.

Primeri

Evo implementacija generatora Snowflake ID-a u raznim jezicima:

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('Sat se pomerio unazad. Odbijam da generišem 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// Upotreba
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generisani Snowflake ID: ${id}`);
58

Dijagram

Evo vizuelne reprezentacije strukture Snowflake ID-a:

Vremenska oznaka (41 bita) ID mašine (10 bita) Sekvenca (12 bita)

Struktura 64-bitnog Snowflake ID-a

Reference

  1. "Najava Snowflake-a." 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. "Distribuirana generacija ID-a u mikrouslugama." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f