Generar i Analitzar l'Eina d'ID Snowflake de Twitter per a Insights
Genera i analitza IDs Snowflake de Twitter, identificadors únics de 64 bits utilitzats en sistemes distribuïts. Aquesta eina et permet crear nous IDs Snowflake i analitzar-ne d'existents, proporcionant informació sobre els seus components de caràcter temporal, ID de màquina i número de seqüència.
Generador d'ID de Snowflake
Documentació
Generador d'ID Snowflake: Crea identificadors únics per a sistemes distribuïts
Què és un generador d'ID Snowflake?
Un generador d'ID Snowflake crea identificadors únics per a sistemes distribuïts, desenvolupat originalment per Twitter per gestionar el processament de dades a gran escala. Aquest potent generador d'ID únics produeix enters de 64 bits compostos d'una marca de temps, ID de màquina i número de seqüència, garantint unicitat entre sistemes distribuïts sense coordinació entre servidors.
La nostra eina gratuïta en línia de generador d'ID Snowflake et permet generar i analitzar IDs Snowflake instantàniament, la qual cosa la fa perfecta per a desenvolupadors que treballen amb microserveis, bases de dades distribuïdes i aplicacions d'alt rendiment.
Com funciona la generació d'ID Snowflake
Els IDs Snowflake són enters de 64 bits amb una estructura dissenyada curosament que garanteix la unicitat:
- 41 bits: Marca de temps (mil·lisegons des d'una època personalitzada)
- 10 bits: ID de màquina (5 bits per a l'ID del centre de dades, 5 bits per a l'ID del treballador)
- 12 bits: Número de seqüència
Aquesta estructura d'ID distribuïda permet la generació d'aproximadament 4.096 IDs únics per mil·lisegon per màquina, la qual cosa la fa ideal per a sistemes distribuïts d'alt rendiment.
Com utilitzar la nostra eina de generador d'ID Snowflake
Segueix aquests passos senzills per generar IDs Snowflake únics:
- Estableix l'època personalitzada (Opcional): Utilitza l'època per defecte de Twitter (2010-11-04T01:42:54.657Z) o estableix la teva pròpia
- Configura els IDs de màquina: Introdueix l'ID de màquina (0-31) i l'ID del centre de dades (0-31)
- Genera ID: Fes clic a "Generar" per crear un nou ID Snowflake únic
- Veure resultats: Veure l'ID generat i el seu desglose dels components
Analitzar IDs Snowflake existents
Per decodificar un ID Snowflake, introdueix-lo al camp "Analitzar ID" i fes clic a "Analitzar" per veure la seva marca de temps, ID de màquina i components de seqüència.
Fórmula de generació d'ID Snowflake
L'algorisme d'ID Snowflake construeix identificadors únics mitjançant operacions a nivell de bits:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
Components de la fórmula:
timestamp
: Nombre de mil·lisegons des de l'èpocadatacenterId
: Enter de 5 bits (0-31) que identifica el centre de dadesworkerId
: Enter de 5 bits (0-31) que identifica la màquina treballadorasequence
: Enter de 12 bits (0-4095) per a múltiples IDs per mil·lisegon
Procés de càlcul d'ID Snowflake
L'algorisme de generació d'ID Snowflake segueix aquests passos precisos:
- Obtenir la marca de temps actual: Recuperar el temps actual en mil·lisegons
- Assegurar l'ordre cronològic: Verificar que la marca de temps superi la darrera marca de temps utilitzada
- Gestionar la mateixa marca de temps: Si la marca de temps coincideix amb la anterior, incrementar el número de seqüència
- Prevenir el desbordament: Si la seqüència arriba a 4096, esperar el següent mil·lisegon
- Combinar components: Utilitzar operacions a nivell de bits per crear l'ID únic final
Aquest procés garanteix IDs que augmenten de manera monòtona dins de cada màquina mentre manté la unicitat global entre sistemes distribuïts.
Casos d'ús i aplicacions d'ID Snowflake
Els IDs Snowflake excel·leixen en diversos escenaris de computació distribuïda:
Casos d'ús principals
- Sistemes distribuïts: Generar IDs únics a través de múltiples màquines sense coordinació
- Processament de dades d'alt volum: Crear IDs ordenables per a conjunts de dades massius
- Arquitectura de microserveis: Assegurar identificadors únics a través de diferents serveis
- Shard de bases de dades: Utilitzar components de marca de temps o ID de màquina per a un particionament de dades eficient
Aplicacions del món real
- Plataformes de xarxes socials: Twitter, Instagram per a IDs de publicacions i usuaris
- Sistemes de comerç electrònic: Seguiment de comandes i gestió d'inventari
- Recollida de dades IoT: Registre d'esdeveniments de dispositius i dades de sensors
- Sistemes financers: Processament de transaccions i pistes d'auditoria
Alternatives i comparacions d'ID Snowflake
Tot i que els IDs Snowflake són potents, altres sistemes de generació d'ID únics inclouen:
Sistemes d'ID alternatius
- UUID (Identificador Únic Universal): Millor per a generació distribuïda sense requisits d'ordenabilitat
- IDs de base de dades auto-incrementals: Solució senzilla limitada a instàncies de base de dades individuals
- ULID (Identificador Únic Lexicogràficament Ordenable): Similar a Snowflake amb codificació base32
- NanoID: Generador de cadenes úniques compactes i segures per a URL per a aplicacions web
Limitacions i consideracions d'ID Snowflake
Entendre les limitacions d'ID Snowflake ajuda en la seva implementació adequada:
Reptes comuns
- Problemes de sincronització del rellotge: Les dependències del temps del sistema poden causar problemes amb ajustaments NTP o canvis d'horari d'estiu
- Limitació de l'any 2079: El desbordament de la marca de temps de 41 bits requereix una planificació a llarg termini per a sistemes d'alta escala
- Gestió de l'ID de màquina: Assegurar IDs de màquina únics a través de grans sistemes distribuïts requereix coordinació
- Desbordament de seqüència: Escenaris d'alt rendiment extrem poden esgotar les 4096 seqüències per mil·lisegon
- Ordenació entre màquines: Els IDs són monòtons per màquina però no globalment entre totes les màquines
Història dels IDs Snowflake
Els IDs Snowflake van ser introduïts per Twitter el 2010 per resoldre el repte de generar identificadors únics distribuïts i ordenables per temps a gran escala. A mesura que la base d'usuaris de Twitter i el volum de tuits van explotar, els IDs auto-incrementals tradicionals es van fer insuficients per a la seva arquitectura distribuïda.
El sistema ha estat adoptat des de llavors per grans empreses tecnològiques com Instagram, Discord i innombrables altres plataformes que requereixen generació d'ID escalable per a sistemes distribuïts.
Exemples de codi del generador d'ID Snowflake
Implementa la generació d'ID Snowflake en el teu llenguatge de programació preferit:
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('El rellotge s\'ha mogut enrere. Es nega a generar 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// Ús
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`ID Snowflake generat: ${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("El rellotge s'ha mogut enrere. Es nega a generar 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## Ús
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"ID Snowflake generat: {snowflake_id}")
61
1import java.util.concurrent.locks.Lock;
2import java.util.concurrent.locks.ReentrantLock;
3
4public class SnowflakeGenerator {
5 private final long epoch;
6 private final long datacenterIdBits;
7 private final long workerIdBits;
8 private final long sequenceBits;
9 private final long maxDatacenterId;
10 private final long maxWorkerId;
11 private final long workerIdShift;
12 private final long datacenterIdShift;
13 private final long timestampLeftShift;
14 private final long sequenceMask;
15
16 private long datacenterId;
17 private long workerId;
18 private long sequence = 0L;
19 private long lastTimestamp = -1L;
20
21 private final Lock lock = new ReentrantLock();
22
23 public SnowflakeGenerator(long datacenterId, long workerId) {
24 this.epoch = 1288834974657L;
25 this.datacenterIdBits = 5L;
26 this.workerIdBits = 5L;
27 this.sequenceBits = 12L;
28
29 this.maxDatacenterId = ~(-1L << datacenterIdBits);
30 this.maxWorkerId = ~(-1L << workerIdBits);
31
32 this.workerIdShift = sequenceBits;
33 this.datacenterIdShift = sequenceBits + workerIdBits;
34 this.timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
35 this.sequenceMask = ~(-1L << sequenceBits);
36
37 if (datacenterId > maxDatacenterId || datacenterId < 0) {
38 throw new IllegalArgumentException("datacenterId no pot ser més gran que maxDatacenterId o menys de 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId no pot ser més gran que maxWorkerId o menys de 0");
42 }
43 this.datacenterId = datacenterId;
44 this.workerId = workerId;
45 }
46
47 public long nextId() {
48 lock.lock();
49 try {
50 long timestamp = timeGen();
51 if (timestamp < lastTimestamp) {
52 throw new RuntimeException("El rellotge s'ha mogut enrere. Es nega a generar id");
53 }
54
55 if (lastTimestamp == timestamp) {
56 sequence = (sequence + 1) & sequenceMask;
57 if (sequence == 0) {
58 timestamp = tilNextMillis(lastTimestamp);
59 }
60 } else {
61 sequence = 0L;
62 }
63
64 lastTimestamp = timestamp;
65
66 return ((timestamp - epoch) << timestampLeftShift) |
67 (datacenterId << datacenterIdShift) |
68 (workerId << workerIdShift) |
69 sequence;
70 } finally {
71 lock.unlock();
72 }
73 }
74
75 private long tilNextMillis(long lastTimestamp) {
76 long timestamp = timeGen();
77 while (timestamp <= lastTimestamp) {
78 timestamp = timeGen();
79 }
80 return timestamp;
81 }
82
83 private long timeGen() {
84 return System.currentTimeMillis();
85 }
86
87 public static void main(String[] args) {
88 SnowflakeGenerator generator = new SnowflakeGenerator(1, 1);
89 long id = generator.nextId();
90 System.out.println("ID Snowflake generat: " + id);
91 }
92}
93
1require 'time'
2
3class SnowflakeGenerator
4 def initialize(datacenter_id, worker_id, sequence = 0)
5 @datacenter_id = datacenter_id
6 @worker_id = worker_id
7 @sequence = sequence
8 @last_timestamp = -1
9 @epoch = 1288834974657
10
11 @datacenter_id_bits = 5
12 @worker_id_bits = 5
13 @sequence_bits = 12
14
15 @max_datacenter_id = -1 ^ (-1 << @datacenter_id_bits)
16 @max_worker_id = -1 ^ (-1 << @worker_id_bits)
17
18 @worker_id_shift = @sequence_bits
19 @datacenter_id_shift = @sequence_bits + @worker_id_bits
20 @timestamp_left_shift = @sequence_bits + @worker_id_bits + @datacenter_id_bits
21 @sequence_mask = -1 ^ (-1 << @sequence_bits)
22 end
23
24 def next_id
25 timestamp = (Time.now.to_f * 1000).to_i
26
27 raise 'El rellotge s\'ha mogut enrere' si timestamp < @last_timestamp
28
29 if timestamp == @last_timestamp
30 @sequence = (@sequence + 1) & @sequence_mask
31 timestamp = til_next_millis(@last_timestamp) si @sequence == 0
32 else
33 @sequence = 0
34 end
35
36 @last_timestamp = timestamp
37
38 ((timestamp - @epoch) << @timestamp_left_shift) |
39 (@datacenter_id << @datacenter_id_shift) |
40 (@worker_id << @worker_id_shift) |
41 @sequence
42 end
43
44 private
45
46 def til_next_millis(last_timestamp)
47 timestamp = (Time.now.to_f * 1000).to_i
48 timestamp = (Time.now.to_f * 1000).to_i mentre timestamp <= last_timestamp
49 timestamp
50 end
51end
52
53## Ús
54generator = SnowflakeGenerator.new(1, 1)
55snowflake_id = generator.next_id
56puts "ID Snowflake generat: #{snowflake_id}"
57
<?php class SnowflakeGenerator { private $epoch; private $datacenterIdBits; private $workerIdBits; private $sequenceBits; private $maxDatacenterId; private $maxWorkerId; private $workerIdShift; private $datacenterIdShift; private $timestampLeftShift; private $sequenceMask; private $datacenterId; private $workerId; private $
Eines Relacionades
Descobreix més eines que podrien ser útils per al teu flux de treball