Snowflake ID Generator for Distributed Systems and Analysis

Generirajte i analizirajte Twitter Snowflake ID-ove, jedinstvene 64-bitne identifikatore koji se koriste u distribuiranim sustavima. Ovaj alat omogućuje vam stvaranje novih Snowflake ID-ova i analiziranje postojećih, pružajući uvide u njihove komponente vremenskog oznake, ID-a stroja i broja sekvence.

Generator ID-a pahuljice

Generator ID-a pahuljice

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

Dokumentacija

Generator ID-a Snježne pahulje

Uvod

ID snježne pahulje je jedinstveni identifikator korišten u distribuiranim sustavima, prvotno razvijen od strane Twittera. Ovaj alat omogućuje generiranje i analizu ID-a snježne pahulje, koji su 64-bitni cjelobrojni identifikatori sastavljeni od vremenskog oznake, ID-a stroja i broja sekvence.

Kako ID-ovi snježne pahulje rade

ID-ovi snježne pahulje su 64-bitni cjelobrojni identifikatori strukturirani na sljedeći način:

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

Ova struktura omogućuje generiranje otprilike 4,096 jedinstvenih ID-a po milisekundi po stroju.

Korištenje generatora ID-a snježne pahulje

  1. (Opcionalno) Postavite prilagođenu epohu (zadano je Twitterova epoha: 2010-11-04T01:42:54.657Z)
  2. Unesite ID stroja (0-31) i ID podatkovnog centra (0-31)
  3. Kliknite "Generiraj" za stvaranje novog ID-a snježne pahulje
  4. Generirani ID i njegovi sastavni dijelovi bit će prikazani

Za analizu postojećeg ID-a snježne pahulje, unesite ga u polje "Analiziraj ID" i kliknite "Analiziraj".

Formula

ID snježne pahulje se konstruira pomoću bitovnih operacija:

1ID = (vremenska oznaka << 22) | (ID_podatkovnog_centra << 17) | (ID_radnika << 12) | sekvenca
2

Gdje:

  • vremenska oznaka je broj milisekundi od epohe
  • ID_podatkovnog_centra je 5-bitni cijeli broj (0-31)
  • ID_radnika je 5-bitni cijeli broj (0-31)
  • sekvenca je 12-bitni cijeli broj (0-4095)

Izračun

Generator ID-a snježne pahulje provodi sljedeće korake:

  1. Dobijte trenutnu vremensku oznaku u milisekundama
  2. Osigurajte da je vremenska oznaka veća od posljednje korištene vremenske oznake (radi jedinstvenosti)
  3. Ako je vremenska oznaka ista kao posljednja, povećajte broj sekvence
  4. Ako broj sekvence pređe granicu (dođe do 4096), pričekajte sljedeću milisekundu
  5. Kombinirajte komponente pomoću bitovnih operacija kako biste stvorili konačni ID

Upotrebe

ID-ovi snježne pahulje su posebno korisni u:

  1. Distribuiranim sustavima: Generiranje jedinstvenih ID-a na više strojeva bez koordinacije
  2. Velikim podacima: Kreiranje sortabilnih ID-a za velike skupove podataka
  3. Mikrouslugama: Osiguranje jedinstvenih identifikatora među različitim uslugama
  4. Podatkovnom dijeljenju: Korištenje vremenske oznake ili ID-a stroja za učinkovito dijeljenje

Alternativa

Iako su ID-ovi snježne pahulje moćni, drugi sustavi generiranja ID-a uključuju:

  1. UUID (Univerzalni jedinstveni identifikator): Koristan kada je potrebna distribuirana generacija bez sortabilnosti
  2. Auto-incrementing ID-evi u bazi podataka: Jednostavni, ali ograničeni na jedinstvene instance baze podataka
  3. ULID (Univerzalni jedinstveni leksikografski sortirani identifikator): Sličan snježnoj pahulji, ali s drugačijom strukturom

Rubne situacije i ograničenja

  1. Sinkronizacija sata: ID-ovi snježne pahulje oslanjaju se na sustavno vrijeme. Ako se sat pomakne unatrag zbog NTP prilagodbi ili promjena ljetnog vremena, može doći do problema s generacijom ID-a.

  2. Problem godine 2038: 41-bitna vremenska oznaka će preplaviti 2079. (pretpostavljajući Twitterovu epohu). Sustavi koji koriste ID-ove snježne pahulje trebali bi planirati za ovu eventualnost.

  3. Sudari ID-a stroja: U velikim distribuiranim sustavima, osiguranje jedinstvenih ID-a stroja može biti izazovno i može zahtijevati dodatnu koordinaciju.

  4. Prelijevanje sekvence: U izuzetno visokim scenarijima, moguće je iscrpiti 4096 sekvenci po milisekundi, što može uzrokovati kašnjenja.

  5. Ne-monotonija između strojeva: Iako su ID-ovi monotonno rastući na jednom stroju, možda neće biti strogo monotonni među više strojeva.

Povijest

ID-ovi snježne pahulje uvedeni su od strane Twittera 2010. godine kako bi se zadovoljila potreba za distribuiranim, vremenski sortabilnim jedinstvenim identifikatorima. Od tada su ih usvojile i prilagodile mnoge druge tvrtke i projekti.

Primjeri

Evo implementacija generatora ID-a snježne pahulje 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 pomaknuo unatrag. Odbijam generirati 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(`Generirani ID snježne pahulje: ${id}`);
58

Dijagram

Evo vizualne reprezentacije strukture ID-a snježne pahulje:

Vremenska oznaka (41 bita) ID stroja (10 bita) Sekvenca (12 bita)

Struktura ID-a snježne pahulje (64 bita)

Reference

  1. "Objava snježne pahulje." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID snježne pahulje." 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