Lumihelmi ID -generaattori: Luo ja analysoi tunnisteita

Luo ja analysoi Twitterin Lumihelmi ID:itä, ainutlaatuisia 64-bittisiä tunnisteita, joita käytetään hajautetuissa järjestelmissä. Tämä työkalu mahdollistaa uusien Lumihelmi ID:iden luomisen ja olemassa olevien ID:iden purkamisen, tarjoten tietoa niiden aikaleimasta, kone-ID:stä ja sekvenssinumerosta.

Lumisateen ID-generaattori

Lumisateen ID-generaattori

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

Dokumentaatio

Snowflake ID Generaattori

Johdanto

Snowflake ID on ainutlaatuinen tunniste, jota käytetään hajautetuissa järjestelmissä, ja se on alun perin kehitetty Twitterissä. Tämä työkalu mahdollistaa Snowflake ID:iden luomisen ja analysoimisen, jotka ovat 64-bittisiä kokonaislukuja, jotka koostuvat aikaleimasta, kone-ID:stä ja sekvenssinumerosta.

Kuinka Snowflake ID:t toimivat

Snowflake ID:t ovat 64-bittisiä kokonaislukuja, jotka on rakennettu seuraavasti:

  • 41 bittiä: Aikaleima (millisekunnit mukautetusta aikapisteestä)
  • 10 bittiä: Kone-ID (5 bittiä datakeskuksen ID:lle, 5 bittiä työntekijän ID:lle)
  • 12 bittiä: Sekvenssinumero

Tämä rakenne mahdollistaa noin 4,096 ainutlaatuisen ID:n generoinnin per millisekunti per kone.

Snowflake ID Generaattorin käyttäminen

  1. (Valinnainen) Aseta mukautettu aikapiste (oletus on Twitterin aikapiste: 2010-11-04T01:42:54.657Z)
  2. Syötä koneen ID (0-31) ja datakeskuksen ID (0-31)
  3. Napsauta "Generoi" luodaksesi uuden Snowflake ID:n
  4. Generoitu ID ja sen komponentit näytetään

Voit purkaa olemassa olevan Snowflake ID:n syöttämällä sen "Purkaa ID" kenttään ja napsauttamalla "Purkaa".

Kaava

Snowflake ID rakennetaan bittimanipulaatioiden avulla:

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

Missä:

  • timestamp on aikaleima millisekunteina aikapisteestä
  • datacenterId on 5-bittinen kokonaisluku (0-31)
  • workerId on 5-bittinen kokonaisluku (0-31)
  • sequence on 12-bittinen kokonaisluku (0-4095)

Laskenta

Snowflake ID generaattori suorittaa seuraavat vaiheet:

  1. Hanki nykyinen aikaleima millisekunneissa
  2. Varmista, että aikaleima on suurempi kuin viimeksi käytetty aikaleima (yksilöllisyyden varmistamiseksi)
  3. Jos aikaleima on sama kuin edellinen, lisää sekvenssinumeroa
  4. Jos sekvenssinumero ylittyy (saavuttaa 4096), odota seuraavaa millisekuntia
  5. Yhdistä komponentit bittimanipulaatioiden avulla luodaksesi lopullinen ID

Käyttötapaukset

Snowflake ID:t ovat erityisen hyödyllisiä:

  1. Hajautetuissa järjestelmissä: Generoi ainutlaatuisia ID:itä useilla koneilla ilman koordinointia
  2. Suurissa tietomäärissä: Luo lajittelukelpoisia ID:itä suurille tietojoukoille
  3. Mikropalveluissa: Varmista ainutlaatuiset tunnisteet eri palveluiden kesken
  4. Tietokannan jakautumisessa: Käytä aikaleima- tai kone-ID-komponenttia tehokkaaseen jakautumiseen

Vaihtoehdot

Vaikka Snowflake ID:t ovat tehokkaita, muita ID:n generointijärjestelmiä ovat:

  1. UUID (Yleisesti ainutlaatuinen tunniste): Hyödyllinen, kun tarvitaan hajautettua generointia ilman lajittelua
  2. Automaattisesti kasvavat tietokannan ID:t: Yksinkertaisia, mutta rajoitettuja vain yhteen tietokantainstanssiin
  3. ULID (Yleisesti ainutlaatuinen, leksikografisesti lajittelukelpoinen tunniste): Samankaltainen kuin Snowflake, mutta eri rakenteella

Rajatapaukset ja rajoitukset

  1. Kellon synkronointi: Snowflake ID:t riippuvat järjestelmän ajasta. Jos kello siirtyy taaksepäin NTP-säätöjen tai kesäajan muutosten vuoksi, se voi aiheuttaa ongelmia ID:n generoinnissa.

  2. Vuosi 2038 ongelma: 41-bittinen aikaleima ylittyy vuonna 2079 (olettaen Twitterin aikapisteen). Snowflake ID:tä käyttävien järjestelmien tulisi suunnitella tätä tilannetta varten.

  3. Kone-ID:n törmäykset: Suurissa hajautetuissa järjestelmissä ainutlaatuisten kone-ID:iden varmistaminen voi olla haastavaa ja saattaa vaatia lisäkoordinaatiota.

  4. Sekvenssin ylivuoto: Erittäin suurissa läpimeno-olosuhteissa on mahdollista, että 4096 sekvenssiä per millisekunti loppuu, mikä voi aiheuttaa viiveitä.

  5. Ei monotonisuutta koneiden välillä: Vaikka ID:t kasvavat monotonisesti yhdellä koneella, ne eivät välttämättä ole tiukasti monotonisia useiden koneiden välillä.

Historia

Snowflake ID:t esiteltiin Twitterissä vuonna 2010 vastaamaan hajautettujen, aikajärjestykseen perustuvien ainutlaatuisten tunnisteiden tarpeeseen. Niitä on sittemmin omaksunut ja mukauttanut moni muu yritys ja projekti.

Esimerkit

Tässä on esimerkkejä Snowflake ID generaattoreista eri kielillä:

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('Kello siirtyi taaksepäin. Kieltäydytään ID:n generoinnista');
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// Käyttö
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generoitu Snowflake ID: ${id}`);
58

Kaavio

Tässä on visuaalinen esitys Snowflake ID:n rakenteesta:

Aikaleima (41 bittiä) Kone-ID (10 bittiä) Sekvenssi (12 bittiä)

64-bittinen Snowflake ID Rakenne

Viitteet

  1. "Snowflake julkistus." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Wikipedia, https://fi.wikipedia.org/wiki/Snowflake_ID
  3. "Hajautettu ID:n generointi mikropalveluissa." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f