Sniegpārsla ID ģenerators
Sniegpārsla ID ģenerators
Snoflake ID ģenerators
Ievads
Snoflake ID ir unikāls identifikators, ko izmanto izplatītajās sistēmās, sākotnēji izstrādājusi Twitter. Šis rīks ļauj ģenerēt un analizēt snoflake ID, kas ir 64 bitu veseli skaitļi, kas sastāv no laika zīmoga, mašīnas ID un secības numura.
Kā darbojas snoflake ID
Snoflake ID ir 64 bitu veseli skaitļi, kuru struktūra ir šāda:
- 41 bits: Laika zīmogs (milisekundes kopš pielāgota laikmeta)
- 10 bits: Mašīnas ID (5 bits datu centra ID, 5 bits darba ID)
- 12 bits: Secības numurs
Šī struktūra ļauj ģenerēt aptuveni 4,096 unikālus ID katrā milisekundē katrai mašīnai.
Snoflake ID ģeneratora izmantošana
- (Pēc izvēles) Iestatiet pielāgotu laikmetu (noklusējums ir Twitter laikmets: 2010-11-04T01:42:54.657Z)
- Ievadiet mašīnas ID (0-31) un datu centra ID (0-31)
- Noklikšķiniet uz "Ģenerēt", lai izveidotu jaunu snoflake ID
- Tiks parādīts ģenerētais ID un tā komponenti
Lai analizētu esošo snoflake ID, ievadiet to laukā "Analizēt ID" un noklikšķiniet uz "Analizēt".
Formula
Snoflake ID tiek konstruēts, izmantojot bitu operācijas:
ID = (laika_zīmogs << 22) | (datu_centra_ID << 17) | (darba_ID << 12) | secība
Kur:
laika_zīmogs
ir milisekundēs kopš laikmetadatu_centra_ID
ir 5 bitu vesels skaitlis (0-31)darba_ID
ir 5 bitu vesels skaitlis (0-31)secība
ir 12 bitu vesels skaitlis (0-4095)
Aprēķins
Snoflake ID ģenerators veic šādas darbības:
- Iegūst pašreizējo laika zīmogu milisekundēs
- Nodrošina, ka laika zīmogs ir lielāks par pēdējo izmantoto laika zīmogu (unikalitātei)
- Ja laika zīmogs ir tāds pats kā iepriekšējais, palielina secības numuru
- Ja secības numurs pārsniedz (sasniedz 4096), gaida nākamo milisekundi
- Apvieno komponentus, izmantojot bitu operācijas, lai izveidotu galīgo ID
Lietošanas gadījumi
Snoflake ID ir īpaši noderīgi:
- Izplatītajās sistēmās: ģenerēt unikālus ID vairākās mašīnās bez koordinācijas
- Augsta apjoma datiem: izveidot kārtotus ID lieliem datu kopām
- Mikroservisos: nodrošināt unikālus identifikatorus dažādām pakalpojumu daļām
- Datu bāzes dalīšanā: izmantot laika zīmoga vai mašīnas ID komponentu efektīvai dalīšanai
Alternatīvas
Lai gan snoflake ID ir jaudīgi, citi ID ģenerēšanas sistēmas ietver:
- UUID (Universāli unikāls identifikators): noderīgs, kad nepieciešama izplatīta ģenerēšana bez kārtotības
- Automātiski pieaugoši datu bāzes ID: vienkārši, bet ierobežoti uz vienas datu bāzes instancēm
- ULID (Universāli unikāli leksikogrāfiski kārtoti identifikatori): līdzīgi snoflake, bet ar citu struktūru
Malu gadījumi un ierobežojumi
-
Pulksteņa sinhronizācija: snoflake ID paļaujas uz sistēmas laiku. Ja pulkstenis atgriežas atpakaļ NTP korekciju vai vasaras laika izmaiņu dēļ, tas var radīt problēmas ID ģenerēšanā.
-
- gada problēma: 41 bitu laika zīmogs pārsniegs 2079. gadā (pieņemot Twitter laikmetu). Sistēmām, kas izmanto snoflake ID, vajadzētu plānot šo iespēju.
-
Mašīnas ID sadursmes: lielās izplatītās sistēmās unikālu mašīnas ID nodrošināšana var būt izaicinājums un var prasīt papildu koordināciju.
-
Secības pārsniegšana: ārkārtīgi augstas caurlaidības scenārijos ir iespējams izsīkt 4096 secības katrā milisekundē, kas potenciāli var izraisīt kavēšanos.
-
Ne-monotonitāte starp mašīnām: Lai gan ID ir monotoniski pieaugoši vienā mašīnā, tie var nebūt stingri monotoni vairākās mašīnās.
Vēsture
Snoflake ID tika ieviesti Twitter 2010. gadā, lai apmierinātu nepieciešamību pēc izplatītiem, laika kārtotiem unikāliem identifikatoriem. Tie kopš tā laika ir pieņemti un pielāgoti daudzu citu uzņēmumu un projektu.
Piemēri
Šeit ir snoflake ID ģeneratoru īstenojumi dažādās valodās:
class SnowflakeGenerator {
constructor(epoch = 1288834974657, datacenterIdBits = 5, workerIdBits = 5, sequenceBits = 12) {
this.epoch = BigInt(epoch);
this.datacenterIdBits = datacenterIdBits;
this.workerIdBits = workerIdBits;
this.sequenceBits = sequenceBits;
this.maxDatacenterId = -1n ^ (-1n << BigInt(datacenterIdBits));
this.maxWorkerId = -1n ^ (-1n << BigInt(workerIdBits));
this.sequenceMask = -1n ^ (-1n << BigInt(sequenceBits));
this.workerIdShift = BigInt(sequenceBits);
this.datacenterIdShift = BigInt(sequenceBits + workerIdBits);
this.timestampLeftShift = BigInt(sequenceBits + workerIdBits + datacenterIdBits);
this.sequence = 0n;
this.lastTimestamp = -1n;
}
nextId(datacenterId, workerId) {
let timestamp = this.currentTimestamp();
if (timestamp < this.lastTimestamp) {
throw new Error('Pulkstenis pārvietojies atpakaļ. Atsakāmies ģenerēt id');
}
if (timestamp === this.lastTimestamp) {
this.sequence = (this.sequence + 1n) & this.sequenceMask;
if (this.sequence === 0n) {
timestamp = this.tilNextMillis(this.lastTimestamp);
}
} else {
this.sequence = 0n;
}
this.lastTimestamp = timestamp;
return ((timestamp - this.epoch) << this.timestampLeftShift) |
(BigInt(datacenterId) << this.datacenterIdShift) |
(BigInt(workerId) << this.workerIdShift) |
this.sequence;
}
tilNextMillis(lastTimestamp) {
let timestamp = this.currentTimestamp();
while (timestamp <= lastTimestamp) {
timestamp = this.currentTimestamp();
}
return timestamp;
}
currentTimestamp() {
return BigInt(Date.now());
}
}
// Lietošana
const generator = new SnowflakeGenerator();
const id = generator.nextId(1, 1);
console.log(`Ģenerētais snoflake ID: ${id}`);
Diagramma
Šeit ir vizuāla snoflake ID struktūras attēlošana:
Atsauces
- "Snoflake paziņojums." Twitter inženierijas blogs, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
- "Snoflake ID." Vikipēdija, https://en.wikipedia.org/wiki/Snowflake_ID
- "Izplatīta ID ģenerēšana mikroservisos." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f