Δημιουργήστε και αναλύστε τα Twitter Snowflake IDs, μοναδικοί 64-bit αναγνωριστές που χρησιμοποιούνται σε κατανεμημένα συστήματα. Αυτό το εργαλείο σας επιτρέπει να δημιουργείτε νέα Snowflake IDs και να αναλύετε υπάρχοντα, παρέχοντας πληροφορίες σχετικά με τα στοιχεία χρονικής σήμανσης, αναγνωριστικού μηχανής και αριθμού ακολουθίας.
Ένας δημιουργός Snowflake ID δημιουργεί μοναδικά αναγνωριστικά για κατανεμημένα συστήματα, που αναπτύχθηκε αρχικά από το Twitter για την επεξεργασία δεδομένων σε μαζική κλίμακα. Αυτός ο ισχυρός δημιουργός μοναδικών ID παράγει 64-bit ακέραιους αριθμούς που αποτελούνται από ένα χρονικό σήμα, αναγνωριστικό μηχανής και αριθμό ακολουθίας, εξασφαλίζοντας μοναδικότητα σε κατανεμημένα συστήματα χωρίς συντονισμό μεταξύ των διακομιστών.
Το δωρεάν διαδικτυακό εργαλείο δημιουργίας Snowflake ID μας σας επιτρέπει να δημιουργείτε και να αναλύετε Snowflake IDs άμεσα, κάνοντάς το ιδανικό για προγραμματιστές που εργάζονται με μικροϋπηρεσίες, κατανεμημένες βάσεις δεδομένων και εφαρμογές υψηλής απόδοσης.
Snowflake IDs είναι 64-bit ακέραιοι αριθμοί με μια προσεκτικά σχεδιασμένη δομή που εγγυάται μοναδικότητα:
Αυτή η κατανεμημένη δομή ID επιτρέπει τη δημιουργία περίπου 4,096 μοναδικών IDs ανά χιλιοστό του δευτερολέπτου ανά μηχανή, καθιστώντας την ιδανική για κατανεμημένα συστήματα υψηλής απόδοσης.
Ακολουθήστε αυτά τα απλά βήματα για να δημιουργήσετε μοναδικά Snowflake IDs:
Για να αποκωδικοποιήσετε ένα Snowflake ID, εισάγετε το στο πεδίο "Ανάλυση ID" και κάντε κλικ στο "Ανάλυση" για να δείτε το χρονικό σήμα, το αναγνωριστικό μηχανής και τα συστατικά ακολουθίας του.
Ο αλγόριθμος Snowflake ID κατασκευάζει μοναδικά αναγνωριστικά χρησιμοποιώντας bitwise λειτουργίες:
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) για πολλαπλά IDs ανά χιλιοστό του δευτερολέπτουΟ αλγόριθμος δημιουργίας Snowflake ID ακολουθεί αυτά τα ακριβή βήματα:
Αυτή η διαδικασία εγγυάται μονοτονικά αυξανόμενα IDs εντός κάθε μηχανής, διατηρώντας ταυτόχρονα τη παγκόσμια μοναδικότητα σε κατανεμημένα συστήματα.
Snowflake IDs διαπρέπουν σε διάφορα σενάρια κατανεμημένης υπολογιστικής:
Ενώ οι Snowflake IDs είναι ισχυρές, άλλα συστήματα δημιουργίας μοναδικών ID περιλαμβάνουν:
Η κατανόηση των περιορισμών Snowflake ID βοηθά στην κατάλληλη εφαρμογή:
Οι Snowflake IDs εισήχθησαν από το Twitter το 2010 για να λύσουν την πρόκληση της δημιουργίας κατανεμημένων, ταξινομήσιμων μοναδικών αναγνωριστικών σε μαζική κλίμακα. Καθώς η βάση χρηστών του Twitter και ο όγκος των tweets εκτοξεύτηκαν, τα παραδοσιακά αυξανόμενα IDs έγιναν ανεπαρκή για την κατανεμημένη αρχιτεκτονική τους.
Το σύστημα έχει υιοθετηθεί από μεγάλες τεχνολογικές εταιρείες, συμπεριλαμβανομένων των Instagram, Discord και αμέτρητων άλλων πλατφορμών που απαιτούν κλιμακωτή δημιουργία ID για κατανεμημένα συστήματα.
Εφαρμόστε τη δημιουργία 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
1import time
2import threading
3
4class SnowflakeGenerator:
5 def __init__(self, datacenter_id, worker_id, sequence=0):
6 self.datacenter_id = datacenter_id
7 self.worker_id = worker_id
8 self.sequence = sequence
9
10 self.last_timestamp = -1
11 self.epoch = 1288834974657
12
13 self.datacenter_id_bits = 5
14 self.worker_id_bits = 5
15 self.sequence_bits = 12
16
17 self.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)
18 self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)
19
20 self.worker_id_shift = self.sequence_bits
21 self.datacenter_id_shift = self.sequence_bits + self.worker_id_bits
22 self.timestamp_left_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bits
23 self.sequence_mask = -1 ^ (-1 << self.sequence_bits)
24
25 self._lock = threading.Lock()
26
27 def _til_next_millis(self, last_timestamp):
28 timestamp = self._get_timestamp()
29 while timestamp <= last_timestamp:
30 timestamp = self._get_timestamp()
31 return timestamp
32
33 def _get_timestamp(self):
34 return int(time.time() * 1000)
35
36 def next_id(self):
37 with self._lock:
38 timestamp = self._get_timestamp()
39
40 if timestamp < self.last_timestamp:
41 raise ValueError("Clock moved backwards. Refusing to generate id")
42
43 if timestamp == self.last_timestamp:
44 self.sequence = (self.sequence + 1) & self.sequence_mask
45 if self.sequence == 0:
46 timestamp = self._til_next_millis(self.last_timestamp)
47 else:
48 self.sequence = 0
49
50 self.last_timestamp = timestamp
51
52 return ((timestamp - self.epoch) << self.timestamp_left_shift) | \
53 (self.datacenter_id << self.datacenter_id_shift) | \
54 (self.worker_id << self.worker_id_shift) | \
55 self.sequence
56
57## Χρήση
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"Generated Snowflake ID: {snowflake_id}")
61
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SnowflakeGenerator { private final long epoch; private final long datacenterIdBits; private final long workerIdBits; private final long sequenceBits; private final long maxDatacenterId; private final long maxWorkerId; private final long workerIdShift; private final long datacenterIdShift; private final long timestampLeftShift; private final long sequenceMask; private long datacenterId; private long workerId; private long sequence = 0L; private long lastTimestamp = -1L; private final Lock lock = new ReentrantLock(); public SnowflakeGenerator(long datacenterId, long workerId) { this.epoch = 1288834974657L; this.datacenterIdBits = 5L; this.workerIdBits = 5L; this.sequenceBits = 12L; this.maxDatacenterId = ~(-1L << datacenterIdBits); this.maxWorkerId = ~(-1L << workerIdBits); this.workerIdShift = sequenceBits; this.datacenterIdShift = sequenceBits + workerIdBits; this.timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; this.sequenceMask = ~(-1L << sequenceBits); if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException("datacenterId can't be greater than maxDatacenterId or less than 0"); } if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException("workerId can't be greater than maxWorkerId or less than 0"); } this.datacenterId = datacenterId; this.workerId = workerId; } public long nextId() { lock.lock(); try { long timestamp = timeGen(); if (timestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id"); } if (lastTimestamp == timestamp) { sequence = (sequence + 1) & sequenceMask; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - epoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; } finally { lock.unlock(); } } private long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } private long timeGen() { return System.currentTimeMillis(); } public static void main(String[] args) { SnowflakeGenerator generator = new SnowflakeGenerator(1, 1); long id = generator.nextId(); System.out.println("Generated Snowflake
Ανακαλύψτε περισσότερα εργαλεία που μπορεί να είναι χρήσιμα για τη ροή εργασίας σας