Sniega pārslas ID ģenerators un analīze rīks

Ģenerējiet un analizējiet Twitter Sniega pārslas ID, unikālus 64 bitu identifikatorus, kas tiek izmantoti izplatītajās sistēmās. Šis rīks ļauj jums izveidot jaunus Sniega pārslas ID un analizēt esošos, sniedzot ieskatu to laika zīmē, mašīnas ID un secības numura komponentos.

Sniegpārsla ID ģenerators

Sniegpārsla ID ģenerators

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

Dokumentācija

Snoflake ID ģenerators

Ievads

Snoflake ID ir unikāls identifikators, ko izmanto izplatītajās sistēmās, sākotnēji izstrādājusi Twitter. Šis rīks ļauj ģenerēt un analizēt snoflake ID, kas ir 64 bitu veseli skaitļi, kas sastāv no laika zīmoga, mašīnas ID un secības numura.

Kā darbojas snoflake ID

Snoflake ID ir 64 bitu veseli skaitļi, kuru struktūra ir šāda:

  • 41 bits: Laika zīmogs (milisekundes kopš pielāgota laikmeta)
  • 10 bits: Mašīnas ID (5 bits datu centra ID, 5 bits darba ID)
  • 12 bits: Secības numurs

Šī struktūra ļauj ģenerēt aptuveni 4,096 unikālus ID katrā milisekundē katrai mašīnai.

Snoflake ID ģeneratora izmantošana

  1. (Pēc izvēles) Iestatiet pielāgotu laikmetu (noklusējums ir Twitter laikmets: 2010-11-04T01:42:54.657Z)
  2. Ievadiet mašīnas ID (0-31) un datu centra ID (0-31)
  3. Noklikšķiniet uz "Ģenerēt", lai izveidotu jaunu snoflake ID
  4. Tiks parādīts ģenerētais ID un tā komponenti

Lai analizētu esošo snoflake ID, ievadiet to laukā "Analizēt ID" un noklikšķiniet uz "Analizēt".

Formula

Snoflake ID tiek konstruēts, izmantojot bitu operācijas:

1ID = (laika_zīmogs << 22) | (datu_centra_ID << 17) | (darba_ID << 12) | secība
2

Kur:

  • laika_zīmogs ir milisekundēs kopš laikmeta
  • datu_centra_ID ir 5 bitu vesels skaitlis (0-31)
  • darba_ID ir 5 bitu vesels skaitlis (0-31)
  • secība ir 12 bitu vesels skaitlis (0-4095)

Aprēķins

Snoflake ID ģenerators veic šādas darbības:

  1. Iegūst pašreizējo laika zīmogu milisekundēs
  2. Nodrošina, ka laika zīmogs ir lielāks par pēdējo izmantoto laika zīmogu (unikalitātei)
  3. Ja laika zīmogs ir tāds pats kā iepriekšējais, palielina secības numuru
  4. Ja secības numurs pārsniedz (sasniedz 4096), gaida nākamo milisekundi
  5. Apvieno komponentus, izmantojot bitu operācijas, lai izveidotu galīgo ID

Lietošanas gadījumi

Snoflake ID ir īpaši noderīgi:

  1. Izplatītajās sistēmās: ģenerēt unikālus ID vairākās mašīnās bez koordinācijas
  2. Augsta apjoma datiem: izveidot kārtotus ID lieliem datu kopām
  3. Mikroservisos: nodrošināt unikālus identifikatorus dažādām pakalpojumu daļām
  4. Datu bāzes dalīšanā: izmantot laika zīmoga vai mašīnas ID komponentu efektīvai dalīšanai

Alternatīvas

Lai gan snoflake ID ir jaudīgi, citi ID ģenerēšanas sistēmas ietver:

  1. UUID (Universāli unikāls identifikators): noderīgs, kad nepieciešama izplatīta ģenerēšana bez kārtotības
  2. Automātiski pieaugoši datu bāzes ID: vienkārši, bet ierobežoti uz vienas datu bāzes instancēm
  3. ULID (Universāli unikāli leksikogrāfiski kārtoti identifikatori): līdzīgi snoflake, bet ar citu struktūru

Malu gadījumi un ierobežojumi

  1. Pulksteņa sinhronizācija: snoflake ID paļaujas uz sistēmas laiku. Ja pulkstenis atgriežas atpakaļ NTP korekciju vai vasaras laika izmaiņu dēļ, tas var radīt problēmas ID ģenerēšanā.

    1. gada problēma: 41 bitu laika zīmogs pārsniegs 2079. gadā (pieņemot Twitter laikmetu). Sistēmām, kas izmanto snoflake ID, vajadzētu plānot šo iespēju.
  2. Mašīnas ID sadursmes: lielās izplatītās sistēmās unikālu mašīnas ID nodrošināšana var būt izaicinājums un var prasīt papildu koordināciju.

  3. Secības pārsniegšana: ārkārtīgi augstas caurlaidības scenārijos ir iespējams izsīkt 4096 secības katrā milisekundē, kas potenciāli var izraisīt kavēšanos.

  4. Ne-monotonitāte starp mašīnām: Lai gan ID ir monotoniski pieaugoši vienā mašīnā, tie var nebūt stingri monotoni vairākās mašīnās.

Vēsture

Snoflake ID tika ieviesti Twitter 2010. gadā, lai apmierinātu nepieciešamību pēc izplatītiem, laika kārtotiem unikāliem identifikatoriem. Tie kopš tā laika ir pieņemti un pielāgoti daudzu citu uzņēmumu un projektu.

Piemēri

Šeit ir snoflake ID ģeneratoru īstenojumi dažādās valodās:

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('Pulkstenis pārvietojies atpakaļ. Atsakāmies ģenerēt 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// Lietošana
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Ģenerētais snoflake ID: ${id}`);
58

Diagramma

Šeit ir vizuāla snoflake ID struktūras attēlošana:

Laika zīmogs (41 bits) Mašīnas ID (10 bits) Secība (12 bits)

64 bitu snoflake ID struktūra

Atsauces

  1. "Snoflake paziņojums." Twitter inženierijas blogs, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snoflake ID." Vikipēdija, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Izplatīta ID ģenerēšana mikroservisos." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f