🛠️

Whiz Tools

Build • Create • Innovate

Hópehely ID Generátor - Új ID-k létrehozása és elemzése

Generálj és elemezz Twitter Hópehely ID-kat, egyedi 64-bites azonosítókat, amelyeket elosztott rendszerekben használnak. Ez az eszköz lehetővé teszi új Hópehely ID-k létrehozását és meglévők elemzését, betekintést nyújtva azok időbélyegébe, gépazonosítójába és sorozatszámába.

Hópehely ID Generátor

Hópehely ID Generátor

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

Dokumentáció

Snowflake ID Generátor

Bevezetés

A Snowflake ID egy egyedi azonosító, amelyet elosztott rendszerekben használnak, eredetileg a Twitter által kifejlesztve. Ez az eszköz lehetővé teszi Snowflake ID-k generálását és elemzését, amelyek 64 bites egész számok, amelyek időbélyegből, gép ID-ből és sorozatszámból állnak.

Hogyan működnek a Snowflake ID-k

A Snowflake ID-k 64 bites egész számok, amelyek a következőképpen vannak struktúrálva:

  • 41 bit: Időbélyeg (ezredmásodpercek a testreszabott epoch óta)
  • 10 bit: Gép ID (5 bit az adatközpont ID-hoz, 5 bit a munkás ID-hoz)
  • 12 bit: Sorozatszám

Ez a struktúra lehetővé teszi körülbelül 4096 egyedi ID generálását millisekundánként gépenként.

A Snowflake ID Generátor használata

  1. (Opcionális) Állítson be egy testreszabott epoch-ot (alapértelmezett a Twitter epoch: 2010-11-04T01:42:54.657Z)
  2. Adjon meg egy gép ID-t (0-31) és adatközpont ID-t (0-31)
  3. Kattintson a "Generálás" gombra egy új Snowflake ID létrehozásához
  4. A generált ID és annak összetevői megjelennek

A meglévő Snowflake ID elemzéséhez írja be azt a "Parse ID" mezőbe, és kattintson a "Parse" gombra.

Formula

A Snowflake ID bitműveletekkel van felépítve:

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

Ahol:

  • timestamp az epoch óta eltelt ezredmásodpercek száma
  • datacenterId egy 5 bites egész szám (0-31)
  • workerId egy 5 bites egész szám (0-31)
  • sequence egy 12 bites egész szám (0-4095)

Számítás

A Snowflake ID generátor a következő lépéseket hajtja végre:

  1. Szerezze meg az aktuális időbélyeget ezredmásodpercekben
  2. Biztosítsa, hogy az időbélyeg nagyobb legyen, mint az utoljára használt időbélyeg (az egyediség érdekében)
  3. Ha az időbélyeg megegyezik az utolsóval, növelje a sorozatszámot
  4. Ha a sorozatszám túllép (eléri a 4096-ot), várjon a következő ezredmásodpercre
  5. Kombinálja az összetevőket bitműveletekkel a végső ID létrehozásához

Felhasználási esetek

A Snowflake ID-k különösen hasznosak a következő területeken:

  1. Elosztott rendszerek: Generáljon egyedi ID-ket több gépen koordináció nélkül
  2. Nagy mennyiségű adat: Hozzon létre rendezhető ID-ket nagy adathalmazon
  3. Mikroszolgáltatások: Biztosítson egyedi azonosítókat különböző szolgáltatások között
  4. Adatbázis sharding: Használja az időbélyeg vagy gép ID összetevőt hatékony shardinghoz

Alternatívák

Bár a Snowflake ID-k erősek, más ID generáló rendszerek is léteznek:

  1. UUID (Universally Unique Identifier): Hasznos, ha elosztott generálásra van szükség anélkül, hogy rendezhetők lennének
  2. Auto-incrementáló adatbázis ID-k: Egyszerű, de korlátozott egyetlen adatbázis példányokra
  3. ULID (Universally Unique Lexicographically Sortable Identifier): Hasonló a Snowflake-hez, de más struktúrával

Széljegyzetek és korlátozások

  1. Óra szinkronizáció: A Snowflake ID-k a rendszeridőtől függenek. Ha az óra visszafelé lép NTP állítások vagy nyári időszámítási változások miatt, problémák léphetnek fel az ID generálásával.

  2. 2038-as probléma: A 41 bites időbélyeg 2079-ben fog túllépni (a Twitter epoch-ot feltételezve). A Snowflake ID-ket használó rendszereknek fel kell készülniük erre az eseményre.

  3. Gép ID ütközések: Nagy elosztott rendszerekben a gép ID-k egyediségének biztosítása kihívást jelenthet, és további koordinációt igényelhet.

  4. Sorozat túllépés: Rendkívül nagy áteresztőképességű forgatókönyvekben lehetséges, hogy kimerítjük a 4096 sorozatszámot ezredmásodpercenként, ami potenciálisan késlekedéseket okozhat.

  5. Nem monotonitás gépek között: Míg az ID-k monoton módon növekvőek egy gépen, több gép között nem biztos, hogy szigorúan monotonok.

Történelem

A Snowflake ID-ket a Twitter vezette be 2010-ben, hogy megoldja az elosztott, időben rendezhető egyedi azonosítók iránti igényt. Azóta sok más cég és projekt is átvette és alkalmazta őket.

Példák

Itt vannak a Snowflake ID generátorok megvalósításai különböző nyelveken:

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('Az óra visszafelé mozdult. Az ID generálásának megtagadása');
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// Használat
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generált Snowflake ID: ${id}`);
58

Diagram

Itt egy vizuális ábrázolás a Snowflake ID struktúrájáról:

Időbélyeg (41 bit) Gép ID (10 bit) Sorozatszám (12 bit)

64 bites Snowflake ID struktúra

Hivatkozások

  1. "A Snowflake bejelentése." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Wikipédia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Elosztott ID generálás mikroszolgáltatásokban." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f