ID snježne pahulje je jedinstveni identifikator korišten u distribuiranim sustavima, prvotno razvijen od strane Twittera. Ovaj alat omogućuje generiranje i analizu ID-a snježne pahulje, koji su 64-bitni cjelobrojni identifikatori sastavljeni od vremenskog oznake, ID-a stroja i broja sekvence.
Kako ID-ovi snježne pahulje rade
ID-ovi snježne pahulje su 64-bitni cjelobrojni identifikatori strukturirani na sljedeći način:
41 bit: Vremenska oznaka (milisekunde od prilagođene epohe)
10 bitova: ID stroja (5 bitova za ID podatkovnog centra, 5 bitova za ID radnika)
12 bitova: Broj sekvence
Ova struktura omogućuje generiranje otprilike 4,096 jedinstvenih ID-a po milisekundi po stroju.
Korištenje generatora ID-a snježne pahulje
(Opcionalno) Postavite prilagođenu epohu (zadano je Twitterova epoha: 2010-11-04T01:42:54.657Z)
Unesite ID stroja (0-31) i ID podatkovnog centra (0-31)
Kliknite "Generiraj" za stvaranje novog ID-a snježne pahulje
Generirani ID i njegovi sastavni dijelovi bit će prikazani
Za analizu postojećeg ID-a snježne pahulje, unesite ga u polje "Analiziraj ID" i kliknite "Analiziraj".
Formula
ID snježne pahulje se konstruira pomoću bitovnih operacija:
ID = (vremenska oznaka << 22) | (ID_podatkovnog_centra << 17) | (ID_radnika << 12) | sekvenca
Gdje:
vremenska oznaka je broj milisekundi od epohe
ID_podatkovnog_centra je 5-bitni cijeli broj (0-31)
ID_radnika je 5-bitni cijeli broj (0-31)
sekvenca je 12-bitni cijeli broj (0-4095)
Izračun
Generator ID-a snježne pahulje provodi sljedeće korake:
Dobijte trenutnu vremensku oznaku u milisekundama
Osigurajte da je vremenska oznaka veća od posljednje korištene vremenske oznake (radi jedinstvenosti)
Ako je vremenska oznaka ista kao posljednja, povećajte broj sekvence
Ako broj sekvence pređe granicu (dođe do 4096), pričekajte sljedeću milisekundu
Kombinirajte komponente pomoću bitovnih operacija kako biste stvorili konačni ID
Upotrebe
ID-ovi snježne pahulje su posebno korisni u:
Distribuiranim sustavima: Generiranje jedinstvenih ID-a na više strojeva bez koordinacije
Velikim podacima: Kreiranje sortabilnih ID-a za velike skupove podataka
Mikrouslugama: Osiguranje jedinstvenih identifikatora među različitim uslugama
Podatkovnom dijeljenju: Korištenje vremenske oznake ili ID-a stroja za učinkovito dijeljenje
Alternativa
Iako su ID-ovi snježne pahulje moćni, drugi sustavi generiranja ID-a uključuju:
UUID (Univerzalni jedinstveni identifikator): Koristan kada je potrebna distribuirana generacija bez sortabilnosti
Auto-incrementing ID-evi u bazi podataka: Jednostavni, ali ograničeni na jedinstvene instance baze podataka
ULID (Univerzalni jedinstveni leksikografski sortirani identifikator): Sličan snježnoj pahulji, ali s drugačijom strukturom
Rubne situacije i ograničenja
Sinkronizacija sata: ID-ovi snježne pahulje oslanjaju se na sustavno vrijeme. Ako se sat pomakne unatrag zbog NTP prilagodbi ili promjena ljetnog vremena, može doći do problema s generacijom ID-a.
Problem godine 2038: 41-bitna vremenska oznaka će preplaviti 2079. (pretpostavljajući Twitterovu epohu). Sustavi koji koriste ID-ove snježne pahulje trebali bi planirati za ovu eventualnost.
Sudari ID-a stroja: U velikim distribuiranim sustavima, osiguranje jedinstvenih ID-a stroja može biti izazovno i može zahtijevati dodatnu koordinaciju.
Prelijevanje sekvence: U izuzetno visokim scenarijima, moguće je iscrpiti 4096 sekvenci po milisekundi, što može uzrokovati kašnjenja.
Ne-monotonija između strojeva: Iako su ID-ovi monotonno rastući na jednom stroju, možda neće biti strogo monotonni među više strojeva.
Povijest
ID-ovi snježne pahulje uvedeni su od strane Twittera 2010. godine kako bi se zadovoljila potreba za distribuiranim, vremenski sortabilnim jedinstvenim identifikatorima. Od tada su ih usvojile i prilagodile mnoge druge tvrtke i projekti.
Primjeri
Evo implementacija generatora ID-a snježne pahulje u raznim jezicima:
<?phpclassSnowflakeGenerator{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$sequence=0;private$lastTimestamp=-1;publicfunction__construct($datacenterId,$workerId){$this->epoch=1288834974657;$this->datacenterIdBits=5;$this->workerIdBits=5;$this->sequenceBits=12;$this->maxDatacenterId=-1^(-1<<$this->datacenterIdBits);$this->maxWorkerId=-1^(-1<<$this->workerIdBits);$this->workerIdShift=$this->sequenceBits;$this->datacenterIdShift=$this->sequenceBits+$this->workerIdBits;$this->timestampLeftShift=$this->sequenceBits+$this->workerIdBits+$this->datacenterIdBits;$this->sequenceMask=-1^(-1<<$this->sequenceBits);if($datacenterId>$this->maxDatacenterId||$datacenterId<0){thrownewException("datacenterId can't be greater than maxDatacenterId or less than 0");}if($workerId>$this->maxWorkerId||$workerId<0){thrownewException("workerId can't be greater than maxWorkerId or less than 0");}$this->datacenterId=$datacenterId;$this->workerId=$workerId;}publicfunctionnextId(){$timestamp=$this->timeGen();if($timestamp<$this->lastTimestamp){thrownewException("Sat se pomaknuo unatrag. Odbijam generirati id");}if($this->lastTimestamp==$timestamp){$this->sequence=($this->sequence+1)&$this->sequenceMask;if($this->sequence==0){$timestamp=$this->tilNextMillis($this->lastTimestamp);}}else{$this->sequence=0;}$this->lastTimestamp=$timestamp;return(($timestamp-$this->epoch)<<$this->timestampLeftShift)|($this->datacenterId<<$this->datacenterIdShift)|($this->workerId<<$this->workerIdShift)|$this->sequence;}privatefunctiontilNextMillis($lastTimestamp){$timestamp=$this->timeGen();while($timestamp<=$lastTimestamp){$timestamp=$this->timeGen();}return$timestamp;}privatefunctiontimeGen(){returnfloor(microtime(true)*1000);}}// Upotreba$generator=newSnowflakeGenerator(1,1);$id=$generator->nextId();echo"Generirani ID snježne pahulje: ".$id."\n";