🛠️

Whiz Tools

Build • Create • Innovate

Générateur d'ID Snowflake pour systèmes distribués

Générez et analysez les ID Snowflake de Twitter, des identifiants uniques de 64 bits utilisés dans les systèmes distribués. Cet outil vous permet de créer de nouveaux ID Snowflake et d'analyser ceux existants, fournissant des informations sur leurs composants de timestamp, d'ID de machine et de numéro de séquence.

Générateur d'ID Snowflake

Générateur d'ID Snowflake

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

Documentation

Générateur d'ID Snowflake

Introduction

Un ID Snowflake est un identifiant unique utilisé dans les systèmes distribués, développé à l'origine par Twitter. Cet outil vous permet de générer et d'analyser des ID Snowflake, qui sont des entiers de 64 bits composés d'un horodatage, d'un ID de machine et d'un numéro de séquence.

Comment fonctionnent les ID Snowflake

Les ID Snowflake sont des entiers de 64 bits structurés comme suit :

  • 41 bits : Horodatage (millisecondes depuis une époque personnalisée)
  • 10 bits : ID de machine (5 bits pour l'ID du centre de données, 5 bits pour l'ID du travailleur)
  • 12 bits : Numéro de séquence

Cette structure permet de générer environ 4 096 ID uniques par milliseconde par machine.

Utilisation du générateur d'ID Snowflake

  1. (Optionnel) Définir une époque personnalisée (par défaut, l'époque de Twitter : 2010-11-04T01:42:54.657Z)
  2. Entrez un ID de machine (0-31) et un ID de centre de données (0-31)
  3. Cliquez sur "Générer" pour créer un nouvel ID Snowflake
  4. L'ID généré et ses composants seront affichés

Pour analyser un ID Snowflake existant, entrez-le dans le champ "Analyser l'ID" et cliquez sur "Analyser".

Formule

L'ID Snowflake est construit à l'aide d'opérations binaires :

1ID = (horodatage << 22) | (idCentreDonnees << 17) | (idTravailleur << 12) | séquence
2

Où :

  • horodatage est le nombre de millisecondes depuis l'époque
  • idCentreDonnees est un entier de 5 bits (0-31)
  • idTravailleur est un entier de 5 bits (0-31)
  • séquence est un entier de 12 bits (0-4095)

Calcul

Le générateur d'ID Snowflake effectue les étapes suivantes :

  1. Obtenez l'horodatage actuel en millisecondes
  2. Assurez-vous que l'horodatage est supérieur au dernier horodatage utilisé (pour l'unicité)
  3. Si l'horodatage est le même que le dernier, incrémentez le numéro de séquence
  4. Si le numéro de séquence déborde (atteint 4096), attendez la milliseconde suivante
  5. Combinez les composants à l'aide d'opérations binaires pour créer l'ID final

Cas d'utilisation

Les ID Snowflake sont particulièrement utiles dans :

  1. Systèmes distribués : Générer des ID uniques sur plusieurs machines sans coordination
  2. Données à fort volume : Créer des ID triables pour de grands ensembles de données
  3. Microservices : Assurer des identifiants uniques à travers différents services
  4. Partitionnement de base de données : Utiliser le composant d'horodatage ou d'ID de machine pour un partitionnement efficace

Alternatives

Bien que les ID Snowflake soient puissants, d'autres systèmes de génération d'ID incluent :

  1. UUID (Identifiant Universel Unique) : Utile lorsque la génération distribuée est nécessaire sans triabilité
  2. IDs de base de données auto-incrémentés : Simples mais limités à des instances de base de données uniques
  3. ULID (Identifiant Universel Unique Lexicographiquement Triable) : Semblable à Snowflake, mais avec une structure différente

Cas limites et limitations

  1. Synchronisation de l'horloge : Les ID Snowflake s'appuient sur l'heure système. Si l'horloge recule en raison d'ajustements NTP ou de changements d'heure d'été, cela peut causer des problèmes de génération d'ID.

  2. Problème de l'an 2038 : L'horodatage de 41 bits débordera en 2079 (en supposant l'époque de Twitter). Les systèmes utilisant des ID Snowflake devraient planifier cette éventualité.

  3. Collisions d'ID de machine : Dans de grands systèmes distribués, garantir des ID de machine uniques peut être difficile et nécessiter une coordination supplémentaire.

  4. Débordement de séquence : Dans des scénarios de très haute capacité, il est possible d'épuiser les 4096 séquences par milliseconde, ce qui peut entraîner des délais.

  5. Non-monotonie entre les machines : Bien que les ID soient monotoniques sur une seule machine, ils peuvent ne pas être strictement monotoniques entre plusieurs machines.

Histoire

Les ID Snowflake ont été introduits par Twitter en 2010 pour répondre au besoin d'identifiants uniques, triables dans le temps, distribués. Ils ont depuis été adoptés et adaptés par de nombreuses autres entreprises et projets.

Exemples

Voici des implémentations de générateurs d'ID Snowflake dans divers langages :

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\'horloge a reculé. Refus de générer l\'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// Utilisation
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`ID Snowflake généré : ${id}`);
58

Diagramme

Voici une représentation visuelle de la structure de l'ID Snowflake :

Horodatage (41 bits) ID de Machine (10 bits) Séquence (12 bits)

Structure de l'ID Snowflake de 64 bits

Références

  1. "Annonçant Snowflake." Blog d'ingénierie Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID Snowflake." Wikipédia, https://fr.wikipedia.org/wiki/ID_Snowflake
  3. "Génération d'ID distribuée dans les microservices." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f