Snowflake ID Generátor - Egyedi Elosztott ID-k Létrehozása
Ingyenes Snowflake ID generátor és elemző. Egyedi 64 bites ID-k generálása elosztott rendszerekhez. Meglévő ID-k elemzése timestamp, gép azonosító és szekvencia kinyerésével.
Hópehely ID Generátor
Opcionális: Unix időbélyeg milliszekundumban (alapértelmezetten az aktuális idő)
Gép ID (0-31)
Adatközpont ID (0-31)
Szekvenciaszám (0-4095)
Dokumentáció
Mi az a Snowflake-ID-generátor?
A Snowflake-ID-generátor időbélyegből, gépazonosítóból és sorszámból állít elő egy egyedi, 64 bites számot. A Twitter 2010-ben hozta létre ezt a formátumot, hogy minden tweet olyan azonosítót kapjon, amelyet sok szerver egyszerre előállíthat anélkül, hogy meg kellene kérdezniük egymástól: „használták már ezt a számot?”. Ez az eszköz a megadott értékekből létrehoz egy Snowflake-ID-t, és megmutatja, hogyan töltik ki ezek az értékek a 64 bitet.
Hogyan működik ez a Snowflake-ID-generátor?
A generátor négy bemenetet fogad:
- Időbélyeg: Unix-időbélyeg ezredmásodpercben. Hagyja üresen a mezőt az aktuális idő használatához.
- Gépid: 0 és 31 közötti egész szám (5 bit). Ez a Twitter eredeti „munkagép-azonosítója”.
- Adatközpont-azonosító: 0 és 31 közötti egész szám (5 bit).
- Sorszám: 0 és 4095 közötti egész szám (12 bit), amely az ugyanabban az ezredmásodpercben létrehozott azonosítók megkülönböztetésére szolgál.
Az eszköz a négy értéket egyetlen 64 bites azonosítóvá egyesíti. Ezután az eredményt binárisan jeleníti meg, időbélyeg-, adatközpont-, gép- és sorszámmezőre bontva.
Az időbélyeg mérésének kezdőpontja egy rögzített időpont, amelyet Twitter-epochként neveznek: 2010. november 4., 1:42:54,657 UTC, vagyis 1 288 834 974 657 ezredmásodperccel a Unix-epoch után. Ez a generátor nem teszi lehetővé ennek a kezdőpontnak a módosítását. Minden általa előállított azonosító ettől az egyetlen rögzített dátumtól számítódik.
A Snowflake-ID felépítése
A Snowflake-ID egy 64 bites egész szám, amely négy részre oszlik; ezeket a legnagyobb helyiértékű bittől lefelé olvassuk:
| Bitek | Mező | Értékkészlet |
|---|---|---|
| 1 | Előjelbit | mindig 0 |
| 41 | Időbélyeg | ezredmásodpercek a Twitter-epoch óta |
| 5 | Adatközpont-azonosító | 0–31 |
| 5 | Gép- (worker-)azonosító | 0–31 |
| 12 | Sorszám | 0–4095 |
A vezető bit mindig 0, ezért a Snowflake-ID mindig pozitív szám. A 41 bites időbélyegmező és a 12 bites sorszámmező teszi lehetővé a Snowflake-ID-k rendezését: a később létrehozott azonosítók időbélyegmezője nagyobb, ezért a korábbiak után jelennek meg a rendezésben.
A Snowflake-ID képlete
A generátor a következő képlettel állítja elő az azonosítót:
ahol d a különbség, t a megadott időbélyeg ezredmásodpercben, I a kész azonosító, c az adatközpont-azonosító, m a gépid, s pedig a sorszám.
A << balra történő biteltolást jelent. Egy szám 22 bittel balra tolása ugyanaz, mint a számmal való szorzás 2²²-del, vagyis 4 194 304-gyel. Az eltolások mértéke (22, 17, 12) közvetlenül a mezők szélességéből következik: a sorszámmező 12 bites, ezért a gépid 12 bittel feljebb helyezkedik el; a gépmező 5 bites, ezért az adatközpont-azonosító 17 bittel feljebb kerül (12 + 5); és így tovább.
Snowflake-ID számítása: számítási példa
Tegyük fel, hogy valaki a következőket adja meg:
- Időbélyeg: 1 288 834 975 657 (pontosan 1 000 ezredmásodperccel a Twitter-epoch után)
- Adatközpont-azonosító: 1
- Gépid: 1
- Sorszám: 0
1. lépés — A különbség meghatározása. Vonjuk ki az epochot az időbélyegből: 1 288 834 975 657 − 1 288 834 974 657 = 1 000.
2. lépés — Az egyes mezők helyükre tolása.
- Időbélyeg: 1 000 << 22 = 4 194 304 000
- Adatközpont-azonosító: 1 << 17 = 131 072
- Gépid: 1 << 12 = 4 096
- Sorszám: 0
3. lépés — Egyesítés bitenkénti VAGY művelettel. Mivel az eltolt mezők nem fedik át egymást, az összeadás ugyanazt az eredményt adja, mint a bitenkénti VAGY művelet:
4 194 304 000 + 131 072 + 4 096 + 0 = 4 194 439 168
Ez a bemenethez tartozó Snowflake-ID. Az eszköz eredménynézete ugyanazt a 64 bites bináris karakterláncot egy 41 bites időbélyegblokkra, egy 5 bites adatközpontblokkra, egy 5 bites gépblokkra és egy 12 bites sorszámblokkra bontja vissza, így látható marad a szám felépítése.
Hol használják a Snowflake-ID-kat?
A Twitter azért hozta létre ezt a formátumot, hogy több ezer adatbázis-gépen egyedi, nagyjából időrendben rendezhető azonosítókat adjon a tweeteknek, központi számláló nélkül, amelyet minden szervernek ellenőriznie kellene. A Discord és az Instagram később hasonló, 64 bites azonosítóterveket vett át az üzenetekhez és bejegyzésekhez. Ugyanez az elv jelenik meg az adatbázisok particionálásában, az e-kereskedelmi rendszerek rendelésazonosítóiban és az elosztott alkalmazások eseménynaplóiban. Minden olyan környezetben használható, ahol sok gép egymástól függetlenül oszt ki azonosítókat, amelyeknek mégis nagyjából időrendben kell rendeződniük.
A Snowflake-ID-k korlátai
Egy éles környezetben működő Snowflake-generátor általában saját, folyamatosan működő órát kezel: ugyanabban az ezredmásodpercben minden létrehozott azonosítónál növeli a sorszámot, majd megvárja a következő ezredmásodpercet, amikor a sorszám eléri a 4 095 értéket. Ez az eszköz nem őrzi meg az állapotot a számítások között. Egyetlen azonosítót állít elő a megadott értékekből, ezért hasznos a formátum tanulmányozására, de eltér egy éles szolgáltatástól.
A kialakításnak rögzített korlátai vannak, függetlenül attól, melyik szolgáltatás valósítja meg:
- Rögzített epoch: ez a generátor csak a 2010. november 4. dátumán vagy azt követően érvényes időbélyegeket fogad el (a Twitter-epochot). A korábbi dátumok nem kódolhatók.
- Időbélyeg-felső határa: a 41 bites időbélyegmező körülbelül 2080 júliusában telik be. Ezt követően az epoch óta eltelt idő különbsége már nem fér el 41 biten.
- Sorszámkorlát: egyetlen gép ugyanabban az ezredmásodpercben csak 4 096 különböző azonosítót adhat ki (0–4095), mielőtt az értékek ismétlődni kezdenének.
- Gépek száma: a gépidhez és az adatközpont-azonosítóhoz egyaránt 5 bit áll rendelkezésre, ezért egy telepítés 1 024 különböző gépazonosságot oszthat ki ütközések nélkül (32 × 32).
- Helyi, nem globális sorrend: az azonosítók csak akkor rendezhetők helyesen egymáshoz képest, ha szinkronizált órájú gépekről származnak. A gépek órái közötti eltérés felboríthatja a szigorú időrendi sorrendet.
A Snowflake-ID története
A Twitter 2010-ben jelentette be a Snowflake-ID formátumát az egyszerű, automatikusan növekvő adatbázis-azonosítók helyettesítésére, amelyek nem skálázhatók sok független adatbázis-szerver között. Az elnevezés abból az elképzelésből ered, hogy a valódi hópelyhekhez hasonlóan nincs két egyforma előállított azonosító. A kialakítást később nyílt forráskódúvá tették, majd más nagy platformok módosított formában átvették, mivel ugyanarra volt szükségük: sok gép által egyszerre előállított, egyedi és rendezhető azonosítókra.
Gyakran ismételt kérdések
Mi az a Snowflake-ID? A Snowflake-ID egy 64 bites szám, amely időbélyegből, gépazonosítóból és sorszámból áll; úgy tervezték, hogy sok gép egymással való egyeztetés nélkül is egyedi azonosítókat állíthasson elő.
Mi a Snowflake-ID képlete?
id = ((timestamp − epoch) << 22) | (dataCenterId << 17) | (machineId << 12) | sequence, ahol az epoch egy rögzített kezdődátum, a << pedig balra történő biteltolás.
Módosíthatom az epochot ebben a generátorban? Nem. Ez az eszköz mindig a rögzített Twitter-epochból, 2010. november 4. dátumtól számítja az időbélyeget. Nincs mező más kezdődátum beállítására.
Dekódolja ez az eszköz a meglévő Snowflake-ID-kat? Nem. Csak új azonosítót állít elő a megadott időbélyegből, gépazonosítóból, adatközpont-azonosítóból és sorszámból, majd megjeleníti az új azonosító bitenkénti felépítését.
Hány Snowflake-ID-t állíthat elő egy gép ezredmásodpercenként? Legfeljebb 4 096-ot, mivel a sorszámmező 12 bites (az értékek 0 és 4 095 közöttiek).
Melyik évig állíthat elő érvényes időbélyegeket ez a generátor? Körülbelül 2080 júliusáig. A 41 bites időbélyegmező legfeljebb körülbelül 69,7 évnyi időt képes tárolni a rögzített 2010 epoch óta; ezt követően az érték túlcsordul a mezőn.
Hivatkozások
- „A Snowflake bejelentése.” Twitter Engineering Blog, 2010.
- "Snowflake ID." Wikipédia, https://en.wikipedia.org/wiki/Snowflake_ID