🛠️

Whiz Tools

Build • Create • Innovate

Generator de ID-uri Snowflake pentru sisteme distribuite

Generați și analizați ID-urile Snowflake de pe Twitter, identificatori unici de 64 de biți utilizați în sisteme distribuite. Acest instrument vă permite să creați noi ID-uri Snowflake și să analizați cele existente, oferind informații despre componentele lor: timestamp, ID-ul mașinii și numărul de secvență.

Generator de ID Snowflake

Generator de ID Snowflake

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

Documentație

Generator de ID Snowflake

Introducere

Un ID Snowflake este un identificator unic folosit în sistemele distribuite, dezvoltat inițial de Twitter. Acest instrument vă permite să generați și să analizați ID-uri Snowflake, care sunt întregi de 64 de biți compuse dintr-un timestamp, ID de mașină și număr de secvență.

Cum funcționează ID-urile Snowflake

ID-urile Snowflake sunt întregi de 64 de biți structurate după cum urmează:

  • 41 de biți: Timestamp (milisecunde de la o epocă personalizată)
  • 10 biți: ID de mașină (5 biți pentru ID de centru de date, 5 biți pentru ID de lucrător)
  • 12 biți: Număr de secvență

Această structură permite generarea a aproximativ 4.096 de ID-uri unice pe milisecundă per mașină.

Utilizarea Generatorului de ID Snowflake

  1. (Opțional) Setați o epocă personalizată (implicit este epoca Twitter: 2010-11-04T01:42:54.657Z)
  2. Introduceți un ID de mașină (0-31) și un ID de centru de date (0-31)
  3. Faceți clic pe „Generați” pentru a crea un nou ID Snowflake
  4. ID-ul generat și componentele sale vor fi afișate

Pentru a analiza un ID Snowflake existent, introduceți-l în câmpul „Analizați ID” și faceți clic pe „Analizați”.

Formula

ID-ul Snowflake este construit folosind operații pe biți:

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

Unde:

  • timestamp este numărul de milisecunde de la epocă
  • datacenterId este un întreg de 5 biți (0-31)
  • workerId este un întreg de 5 biți (0-31)
  • sequence este un întreg de 12 biți (0-4095)

Calcul

Generatorul de ID Snowflake efectuează următorii pași:

  1. Obțineți timestamp-ul curent în milisecunde
  2. Asigurați-vă că timestamp-ul este mai mare decât ultimul timestamp utilizat (pentru unicitate)
  3. Dacă timestamp-ul este același cu ultimul, incrementați numărul de secvență
  4. Dacă numărul de secvență depășește (ajunge la 4096), așteptați următoarea milisecundă
  5. Combinați componentele folosind operații pe biți pentru a crea ID-ul final

Cazuri de utilizare

ID-urile Snowflake sunt deosebit de utile în:

  1. Sisteme Distribuite: Generați ID-uri unice în între multiple mașini fără coordonare
  2. Date de Volum Mare: Creați ID-uri sortabile pentru seturi mari de date
  3. Microservicii: Asigurați identificatori unici în diferite servicii
  4. Fragmentarea Bazei de Date: Utilizați componenta timestamp sau ID-ul mașinii pentru fragmentare eficientă

Alternative

Deși ID-urile Snowflake sunt puternice, alte sisteme de generare a ID-urilor includ:

  1. UUID (Identificator Unic Universal): Util pentru generarea distribuită fără sortabilitate
  2. ID-uri de bază de date auto-incrementate: Simple, dar limitate la instanțe unice de baze de date
  3. ULID (Identificator Universal Unic Lexicografic Sortabil): Similar cu Snowflake, dar cu o structură diferită

Cazuri limită și limitări

  1. Sincronizarea Ceasului: ID-urile Snowflake se bazează pe timpul sistemului. Dacă ceasul se mișcă înapoi din cauza ajustărilor NTP sau a schimbărilor de oră de vară, pot apărea probleme cu generarea ID-urilor.

  2. Problema Anului 2038: Timestamp-ul de 41 de biți va depăși în 2079 (presupunând epoca Twitter). Sistemele care utilizează ID-uri Snowflake ar trebui să planifice pentru această eventualitate.

  3. Coliziunile ID-ului de Mașină: În sisteme distribuite mari, asigurarea ID-urilor unice de mașină poate fi provocatoare și poate necesita coordonare suplimentară.

  4. Depășirea Secvenței: În scenarii de throughput extrem de ridicat, este posibil să epuizați cele 4096 de secvențe pe milisecundă, provocând întârzieri.

  5. Non-monotonie între Mașini: Deși ID-urile sunt în creștere monotonă pe o singură mașină, acestea pot să nu fie strict monotone între mai multe mașini.

Istoric

ID-urile Snowflake au fost introduse de Twitter în 2010 pentru a răspunde nevoii de identificatori unici distribuiți, sortabili în timp. Acestea au fost adoptate și adaptate de multe alte companii și proiecte.

Exemple

Iată implementări ale generatorilor de ID Snowflake în diverse limbaje:

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('Ceasul s-a mișcat înapoi. Refuz să generez 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// Utilizare
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`ID Snowflake generat: ${id}`);
58

Diagramă

Iată o reprezentare vizuală a structurii ID-ului Snowflake:

Timestamp (41 biți) ID de Mașină (10 biți) Secvență (12 biți)

Structura ID-ului Snowflake de 64 de biți

Referințe

  1. "Anunțând Snowflake." Blogul de Inginerie Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID Snowflake." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Generarea ID-urilor Distribuite în Microservicii." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f