🛠️

Whiz Tools

Build • Create • Innovate

Γεννήτρια Snowflake IDs για κατανεμημένα συστήματα

Δημιουργήστε και αναλύστε τα Twitter Snowflake IDs, μοναδικούς 64-bit αναγνωριστικούς αριθμούς που χρησιμοποιούνται σε κατανεμημένα συστήματα. Αυτό το εργαλείο σας επιτρέπει να δημιουργείτε νέα Snowflake IDs και να αναλύετε υπάρχοντα, παρέχοντας πληροφορίες σχετικά με τα συστατικά τους, όπως χρονική σήμανση, αναγνωριστικό μηχανής και αριθμό ακολουθίας.

Γεννήτρια ID Snowflake

Γεννήτρια ID Snowflake

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

Τεκμηρίωση

Snowflake ID Generator

Εισαγωγή

Ένα Snowflake ID είναι ένας μοναδικός αναγνωριστικός αριθμός που χρησιμοποιείται σε κατανεμημένα συστήματα, που αναπτύχθηκε αρχικά από το Twitter. Αυτό το εργαλείο σας επιτρέπει να δημιουργείτε και να αναλύετε Snowflake IDs, τα οποία είναι 64-bit ακέραιοι αριθμοί που αποτελούνται από ένα χρονοσφραγίδα, αναγνωριστικό μηχανής και αριθμό ακολουθίας.

Πώς λειτουργούν τα Snowflake IDs

Τα Snowflake IDs είναι 64-bit ακέραιοι αριθμοί που δομούνται ως εξής:

  • 41 bits: Χρονοσφραγίδα (χιλιοστά από μια προσαρμοσμένη εποχή)
  • 10 bits: Αναγνωριστικό μηχανής (5 bits για το αναγνωριστικό κέντρου δεδομένων, 5 bits για το αναγνωριστικό εργαζομένου)
  • 12 bits: Αριθμός ακολουθίας

Αυτή η δομή επιτρέπει τη δημιουργία περίπου 4.096 μοναδικών IDs ανά χιλιοστά του δευτερολέπτου ανά μηχανή.

Χρήση του Snowflake ID Generator

  1. (Προαιρετικά) Ρυθμίστε μια προσαρμοσμένη εποχή (η προεπιλογή είναι η εποχή του Twitter: 2010-11-04T01:42:54.657Z)
  2. Εισάγετε ένα αναγνωριστικό μηχανής (0-31) και αναγνωριστικό κέντρου δεδομένων (0-31)
  3. Κάντε κλικ στο "Δημιουργία" για να δημιουργήσετε ένα νέο Snowflake ID
  4. Το παραγόμενο ID και τα συστατικά του θα εμφανιστούν

Για να αναλύσετε ένα υπάρχον Snowflake ID, εισάγετε το στο πεδίο "Ανάλυση ID" και κάντε κλικ στο "Ανάλυση".

Τύπος

Το Snowflake ID κατασκευάζεται χρησιμοποιώντας bitwise operations:

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

Όπου:

  • timestamp είναι ο αριθμός χιλιοστών από την εποχή
  • datacenterId είναι ένας 5-bit ακέραιος αριθμός (0-31)
  • workerId είναι ένας 5-bit ακέραιος αριθμός (0-31)
  • sequence είναι ένας 12-bit ακέραιος αριθμός (0-4095)

Υπολογισμός

Ο γεννήτορας Snowflake ID εκτελεί τα εξής βήματα:

  1. Λάβετε την τρέχουσα χρονοσφραγίδα σε χιλιοστά
  2. Βεβαιωθείτε ότι η χρονοσφραγίδα είναι μεγαλύτερη από την τελευταία χρησιμοποιούμενη χρονοσφραγίδα (για μοναδικότητα)
  3. Εάν η χρονοσφραγίδα είναι η ίδια με την τελευταία, αυξήστε τον αριθμό ακολουθίας
  4. Εάν ο αριθμός ακολουθίας υπερχειλίσει (φτάσει το 4096), περιμένετε για την επόμενη χιλιοστά
  5. Συνδυάστε τα συστατικά χρησιμοποιώντας bitwise operations για να δημιουργήσετε το τελικό ID

Χρήσεις

Τα Snowflake IDs είναι ιδιαίτερα χρήσιμα σε:

  1. Κατανεμημένα Συστήματα: Δημιουργία μοναδικών IDs σε πολλές μηχανές χωρίς συντονισμό
  2. Υψηλού Όγκου Δεδομένα: Δημιουργία ταξινομήσιμων IDs για μεγάλες βάσεις δεδομένων
  3. Μικροϋπηρεσίες: Διασφάλιση μοναδικών αναγνωριστικών σε διάφορες υπηρεσίες
  4. Κατανομή Βάσεων Δεδομένων: Χρήση του χρονοσφραγίδας ή του συστατικού αναγνωριστικού μηχανής για αποδοτική κατανομή

Εναλλακτικές

Ενώ τα Snowflake IDs είναι ισχυρά, άλλα συστήματα δημιουργίας ID περιλαμβάνουν:

  1. UUID (Καθολικά Μοναδικός Αναγνωριστικός Αριθμός): Χρήσιμο όταν απαιτείται κατανεμημένη δημιουργία χωρίς ταξινομησιμότητα
  2. Αυτόματοι αυξανόμενοι αναγνωριστικοί αριθμοί βάσεων δεδομένων: Απλοί αλλά περιορισμένοι σε μεμονωμένα παραδείγματα βάσεων δεδομένων
  3. ULID (Καθολικά Μοναδικά Ταξινομήσιμα Αναγνωριστικά): Παρόμοια με τα Snowflake, αλλά με διαφορετική δομή

Άκρα Περίπτωση και Περιορισμοί

  1. Συγχρονισμός Ρολογιού: Τα Snowflake IDs βασίζονται στον χρόνο του συστήματος. Εάν το ρολόι μετακινηθεί προς τα πίσω λόγω ρυθμίσεων NTP ή αλλαγών ώρας θερινής ώρας, μπορεί να προκαλέσει προβλήματα στη δημιουργία ID.

  2. Πρόβλημα Έτους 2038: Ο 41-bit χρονοσφραγίδας θα υπερχειλίσει το 2079 (υποθέτοντας την εποχή του Twitter). Τα συστήματα που χρησιμοποιούν Snowflake IDs θα πρέπει να σχεδιάσουν για αυτή την eventuality.

  3. Συγκρούσεις Αναγνωριστικού Μηχανής: Σε μεγάλα κατανεμημένα συστήματα, η διασφάλιση μοναδικών αναγνωριστικών μηχανών μπορεί να είναι δύσκολη και μπορεί να απαιτεί πρόσθετο συντονισμό.

  4. Υπερχειλία Ακολουθίας: Σε εξαιρετικά υψηλής ροής σενάρια, είναι δυνατό να εξαντληθούν οι 4096 ακολουθίες ανά χιλιοστά, ενδεχομένως προκαλώντας καθυστερήσεις.

  5. Μη Μονοτονία σε Πολλές Μηχανές: Ενώ τα IDs είναι μονοτονικά αυξανόμενα σε μια μόνο μηχανή, μπορεί να μην είναι αυστηρά μονοτονικά σε πολλές μηχανές.

Ιστορία

Τα Snowflake IDs εισήχθησαν από το Twitter το 2010 για να καλύψουν την ανάγκη για κατανεμημένα, ταξινομήσιμα μοναδικά αναγνωριστικά. Έχουν από τότε υιοθετηθεί και προσαρμοστεί από πολλές άλλες εταιρείες και έργα.

Παραδείγματα

Ακολουθούν υλοποιήσεις γεννητριών Snowflake ID σε διάφορες γλώσσες:

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('Clock moved backwards. Refusing to generate 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// Χρήση
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generated Snowflake ID: ${id}`);
58

Διάγραμμα

Ακολουθεί μια οπτική αναπαράσταση της δομής του Snowflake ID:

Χρονοσφραγίδα (41 bits) Μηχανή ID (10 bits) Ακολουθία (12 bits)

Δομή 64-bit Snowflake ID

Αναφορές

  1. "Ανακοίνωση Snowflake." Blog Μηχανικής Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Κατανεμημένη Δημιουργία ID σε Μικροϋπηρεσίες." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f
🔗

Σχετικά Εργαλεία

Ανακαλύψτε περισσότερα εργαλεία που μπορεί να είναι χρήσιμα για τη ροή εργασίας σας