🛠️

Whiz Tools

Build • Create • Innovate

Lumehelbe ID generaatori tööriist unikaalsete ID-de loomiseks

Genereeri ja analüüsi Twitteri lumehelbe ID-sid, unikaalseid 64-bitiseid identifikaatoreid, mida kasutatakse hajutatud süsteemides. See tööriist võimaldab sul luua uusi lumehelbe ID-sid ja analüüsida olemasolevaid, pakkudes ülevaate nende ajatempli, masina ID ja järjestuse numbri komponentidest.

Lume ID generaator

Lume ID generaator

Optional: Unix timestamp in milliseconds (defaults to current time)
📚

Dokumentatsioon

Snowflake ID Generaator

Sissejuhatus

Snowflake ID on ainulaadne identifikaator, mida kasutatakse jaotatud süsteemides, mille on algselt välja töötanud Twitter. See tööriist võimaldab teil genereerida ja analüüsida Snowflake ID-sid, mis on 64-bitised täisarvud, mis koosnevad ajatempost, masinast ja järjestusnumbrist.

Kuidas Snowflake ID-d töötavad

Snowflake ID-d on 64-bitised täisarvud, mille struktuur on järgmine:

  • 41 bitti: Aeg (millisekundid alates kohandatud ajast)
  • 10 bitti: Masina ID (5 bitti andmekeskuse ID jaoks, 5 bitti töötaja ID jaoks)
  • 12 bitti: Järjestusnumber

See struktuur võimaldab genereerida umbes 4,096 unikaalset ID-d millisekundi kohta masina kohta.

Snowflake ID generaatori kasutamine

  1. (Valikuline) Määrake kohandatud ajastu (vaikimisi on Twitteri ajastu: 2010-11-04T01:42:54.657Z)
  2. Sisestage masina ID (0-31) ja andmekeskuse ID (0-31)
  3. Klõpsake "Genereeri", et luua uus Snowflake ID
  4. Genereeritud ID ja selle komponendid kuvatakse

Olemasoleva Snowflake ID analüüsimiseks sisestage see "Analüüsi ID" väljale ja klõpsake "Analüüsi".

Valem

Snowflake ID konstrueeritakse bitwise operatsioonide abil:

1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2

Kus:

  • timestamp on ajavahemik millisekundites alates ajast
  • datacenterId on 5-bitine täisarv (0-31)
  • workerId on 5-bitine täisarv (0-31)
  • sequence on 12-bitine täisarv (0-4095)

Arvutus

Snowflake ID generaator täidab järgmised sammud:

  1. Saage praegune ajavahemik millisekundites
  2. Veenduge, et ajavahemik on suurem kui viimasena kasutatud ajavahemik (ainulaadsuse tagamiseks)
  3. Kui ajavahemik on sama, suurendage järjestusnumbrit
  4. Kui järjestusnumber ületab (saab 4096), oodake järgmist millisekundit
  5. Kombineerige komponendid bitwise operatsioonide abil, et luua lõplik ID

Kasutusalad

Snowflake ID-d on eriti kasulikud:

  1. Jaotatud süsteemides: genereerige unikaalsed ID-d mitme masina vahel ilma koordineerimiseta
  2. Suure mahuga andmed: looge sorteeritavad ID-d suurte andmekogumite jaoks
  3. Mikroteenustes: tagage unikaalsed identifikaatorid erinevate teenuste vahel
  4. Andmebaasi jagamisel: kasutage ajavahemiku või masina ID komponenti tõhusaks jagamiseks

Alternatiivid

Kuigi Snowflake ID-d on võimsad, sisaldavad teised ID genereerimise süsteemid:

  1. UUID (Universaalselt ainulaadne identifikaator): kasulik, kui jaotatud genereerimine on vajalik ilma sorteeritavuseta
  2. Automaatne suurenev andmebaasi ID: lihtne, kuid piiratud ühe andmebaasi instantsidega
  3. ULID (Universaalselt ainulaadne lexikograafiliselt sorteeritav identifikaator): sarnane Snowflake'ile, kuid erineva struktuuriga

Äärmuslikud juhtumid ja piirangud

  1. Kella sünkroniseerimine: Snowflake ID-d sõltuvad süsteemi ajast. Kui kell liigub tagasi NTP kohanduste või suveaja muutuste tõttu, võib see põhjustada probleeme ID genereerimisel.

  2. Aasta 2038 probleem: 41-bitine ajavahemik ületab 2079. aastal (eeldades Twitteri ajastut). Snowflake ID-sid kasutavad süsteemid peaksid selle võimaluse jaoks planeerima.

  3. Masina ID kokkulangemised: Suurtes jaotatud süsteemides võib unikaalsete masina ID-de tagamine olla keeruline ja võib nõuda täiendavat koordineerimist.

  4. Järjestuse ületamine: Äärmiselt kõrge läbilaskevõime korral on võimalik ammendada 4096 järjestust millisekundi kohta, mis võib põhjustada viivitusi.

  5. Mitte-monotoonsus masinate vahel: Kuigi ID-d on monotoolselt kasvavad ühel masinal, ei pruugi nad olla rangelt monotoolsed mitme masina vahel.

Ajalugu

Snowflake ID-d tutvustati Twitteris 2010. aastal, et rahuldada jaotatud, ajasorteeritavate ainulaadsete identifikaatorite vajadust. Neid on alates sellest ajast kasutanud ja kohandanud paljud teised ettevõtted ja projektid.

Näited

Siin on Snowflake ID generaatorite rakendused erinevates keeltes:

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('Kell liikus tagasi. ID genereerimine keelatud');
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// Kasutamine
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Genereeritud Snowflake ID: ${id}`);
58

Diagramm

Siin on visuaalne esitus Snowflake ID struktuurist:

Aeg (41 bitti) Masina ID (10 bitti) Järjestus (12 bitti)

64-bitine Snowflake ID struktuur

Viidatud allikad

  1. "Snowflake'i kuulutamine." Twitteri inseneriblogi, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Jaotatud ID genereerimine mikroteenustes." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f