🛠️

Whiz Tools

Build • Create • Innovate

Generatore di ID Snowflake per sistemi distribuiti

Genera e analizza gli ID Snowflake di Twitter, identificatori unici a 64 bit utilizzati nei sistemi distribuiti. Questo strumento consente di creare nuovi ID Snowflake e analizzare quelli esistenti, fornendo informazioni sui loro componenti di timestamp, ID macchina e numero di sequenza.

Generatore ID Snowflake

Generatore ID Snowflake

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

Documentazione

Generatore di ID Snowflake

Introduzione

Un ID Snowflake è un identificatore unico utilizzato nei sistemi distribuiti, originariamente sviluppato da Twitter. Questo strumento consente di generare e analizzare ID Snowflake, che sono interi a 64 bit composti da un timestamp, un ID macchina e un numero di sequenza.

Come Funzionano gli ID Snowflake

Gli ID Snowflake sono interi a 64 bit strutturati come segue:

  • 41 bit: Timestamp (millisecondi da un'epoca personalizzata)
  • 10 bit: ID macchina (5 bit per l'ID del data center, 5 bit per l'ID del lavoratore)
  • 12 bit: Numero di sequenza

Questa struttura consente la generazione di circa 4.096 ID unici per millisecondo per macchina.

Utilizzo del Generatore di ID Snowflake

  1. (Facoltativo) Imposta un'epoca personalizzata (predefinita è l'epoca di Twitter: 2010-11-04T01:42:54.657Z)
  2. Inserisci un ID macchina (0-31) e un ID del data center (0-31)
  3. Clicca su "Genera" per creare un nuovo ID Snowflake
  4. L'ID generato e i suoi componenti verranno visualizzati

Per analizzare un ID Snowflake esistente, inseriscilo nel campo "Analizza ID" e clicca su "Analizza".

Formula

L'ID Snowflake è costruito utilizzando operazioni bitwise:

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

Dove:

  • timestamp è il numero di millisecondi dall'epoca
  • datacenterId è un intero a 5 bit (0-31)
  • workerId è un intero a 5 bit (0-31)
  • sequence è un intero a 12 bit (0-4095)

Calcolo

Il generatore di ID Snowflake esegue i seguenti passaggi:

  1. Ottieni il timestamp corrente in millisecondi
  2. Assicurati che il timestamp sia maggiore dell'ultimo timestamp utilizzato (per l'unicità)
  3. Se il timestamp è lo stesso dell'ultimo, incrementa il numero di sequenza
  4. Se il numero di sequenza trabocca (raggiunge 4096), attendi il millisecondo successivo
  5. Combina i componenti utilizzando operazioni bitwise per creare l'ID finale

Casi d'Uso

Gli ID Snowflake sono particolarmente utili in:

  1. Sistemi Distribuiti: Genera ID unici su più macchine senza coordinamento
  2. Dati ad Alto Volume: Crea ID ordinabili per grandi dataset
  3. Microservizi: Assicura identificatori unici tra diversi servizi
  4. Sharding del Database: Utilizza il componente timestamp o ID macchina per uno sharding efficiente

Alternative

Sebbene gli ID Snowflake siano potenti, altri sistemi di generazione di ID includono:

  1. UUID (Identificatore Unico Universale): Utile quando è necessaria una generazione distribuita senza ordinabilità
  2. ID di database auto-incrementanti: Semplice ma limitato a singole istanze di database
  3. ULID (Identificatore Universale Unico Lessicograficamente Ordinabile): Simile a Snowflake, ma con una struttura diversa

Casi Limite e Limitazioni

  1. Sincronizzazione dell'Orologio: Gli ID Snowflake si basano sul tempo di sistema. Se l'orologio si sposta all'indietro a causa di aggiustamenti NTP o cambiamenti dell'ora legale, possono sorgere problemi con la generazione degli ID.

  2. Problema dell'Anno 2038: Il timestamp a 41 bit traboccherà nel 2079 (supponendo l'epoca di Twitter). I sistemi che utilizzano ID Snowflake dovrebbero pianificare per questa eventualità.

  3. Collisioni di ID Macchina: Nei grandi sistemi distribuiti, garantire ID macchina unici può essere una sfida e potrebbe richiedere ulteriore coordinamento.

  4. Overflow della Sequenza: In scenari estremamente ad alto throughput, è possibile esaurire le 4096 sequenze per millisecondo, causando potenzialmente ritardi.

  5. Non Monotonicità tra le Macchine: Sebbene gli ID siano monotonicamente crescenti su una singola macchina, potrebbero non essere strettamente monotoni tra più macchine.

Storia

Gli ID Snowflake sono stati introdotti da Twitter nel 2010 per affrontare la necessità di identificatori unici ordinabili nel tempo e distribuiti. Sono stati successivamente adottati e adattati da molte altre aziende e progetti.

Esempi

Ecco implementazioni di generatori di ID Snowflake in vari linguaggi:

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('L\'orologio si è spostato all'indietro. Rifiuto di generare 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// Utilizzo
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`ID Snowflake generato: ${id}`);
58

Diagramma

Ecco una rappresentazione visiva della struttura dell'ID Snowflake:

Timestamp (41 bit) ID Macchina (10 bit) Sequenza (12 bit)

Struttura ID Snowflake a 64 bit

Riferimenti

  1. "Annuncio di Snowflake." Blog di Ingegneria di Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID Snowflake." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Generazione di ID Distribuiti nei Microservizi." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f