Генератор на уникални Snowflake ID за разпределени системи

Генерирайте и анализирайте Twitter Snowflake ID, уникални 64-битови идентификатори, използвани в разпределени системи. Този инструмент ви позволява да създавате нови Snowflake ID и да анализирате съществуващи, предоставяйки информация за техните компоненти: времеви печат, ID на машина и номер на последователност.

Генератор на Snowflake ID

Генератор на Snowflake ID

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

Документация

Генератор на Snowflake ID

Въведение

Snowflake ID е уникален идентификатор, използван в разпределени системи, първоначално разработен от Twitter. Този инструмент ви позволява да генерирате и анализирате Snowflake ID, които са 64-битови цели числа, съставени от времеви печат, идентификатор на машина и номер на последователност.

Как работят Snowflake ID

Snowflake ID са 64-битови цели числа, структурирани по следния начин:

  • 41 бит: Времеви печат (милисекунди от собствена епоха)
  • 10 бита: Идентификатор на машина (5 бита за идентификатор на дата център, 5 бита за идентификатор на работник)
  • 12 бита: Номер на последователност

Тази структура позволява генерирането на приблизително 4,096 уникални ID на милисекунда на машина.

Използване на генератора на Snowflake ID

  1. (По избор) Задайте собствена епоха (по подразбиране е епохата на Twitter: 2010-11-04T01:42:54.657Z)
  2. Въведете идентификатор на машина (0-31) и идентификатор на дата център (0-31)
  3. Щракнете върху "Генерирай", за да създадете нов Snowflake ID
  4. Генерираният ID и неговите компоненти ще бъдат показани

За да анализирате съществуващ Snowflake ID, въведете го в полето "Анализиране на ID" и щракнете върху "Анализиране".

Формула

Snowflake ID се конструира с помощта на битови операции:

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

Където:

  • timestamp е броят на милисекундите от епохата
  • datacenterId е 5-битов цяло число (0-31)
  • workerId е 5-битов цяло число (0-31)
  • sequence е 12-битов цяло число (0-4095)

Изчисление

Генераторът на Snowflake ID извършва следните стъпки:

  1. Вземете текущия времеви печат в милисекунди
  2. Уверете се, че времевият печат е по-голям от последния използван времеви печат (за уникалност)
  3. Ако времевият печат е същият като последния, увеличете номера на последователността
  4. Ако номерът на последователността прелее (достигне 4096), изчакайте следващата милисекунда
  5. Комбинирайте компонентите с помощта на битови операции, за да създадете окончателния ID

Случаи на употреба

Snowflake ID са особено полезни в:

  1. Разпределени системи: Генерирайте уникални ID на множество машини без координация
  2. Високобройни данни: Създайте сортиращи ID за големи набори от данни
  3. Микросервизи: Осигурете уникални идентификатори между различни услуги
  4. Разделяне на бази данни: Използвайте времевия печат или компонента на идентификатора на машината за ефективно разделяне

Алтернативи

Докато Snowflake ID са мощни, други системи за генериране на ID включват:

  1. UUID (Универсален уникален идентификатор): Полезен, когато е необходимо разпределено генериране без сортиране
  2. Автоинкрементни идентификатори на бази данни: Прости, но ограничени до единични инстанции на бази данни
  3. ULID (Универсален уникален лексикографски сортиран идентификатор): Подобен на Snowflake, но с различна структура

Гранични случаи и ограничения

  1. Синхронизация на часовника: Snowflake ID разчитат на системното време. Ако часовникът се върне назад поради корекции на NTP или промени в лятното часово време, това може да предизвика проблеми с генерирането на ID.

  2. Проблемът с годината 2038: 41-битовият времеви печат ще прелее през 2079 (при условие, че епохата на Twitter). Системите, използващи Snowflake ID, трябва да планират за това.

  3. Колизии на идентификаторите на машините: В големи разпределени системи, осигуряването на уникални идентификатори на машините може да бъде предизвикателство и може да изисква допълнителна координация.

  4. Преливане на последователността: В изключително високообемни сценарии е възможно да се изчерпат 4096 последователности на милисекунда, което потенциално да предизвика забавяния.

  5. Ненадеждност на последователността между машините: Докато ID са монотонно нарастващи на една машина, те може да не са строго монотонни между множество машини.

История

Snowflake ID бяха въведени от Twitter през 2010 г. с цел да се задоволи нуждата от разпределени, времево-сортирани уникални идентификатори. Те оттогава са приети и адаптирани от много други компании и проекти.

Примери

Ето реализации на генератори на Snowflake ID на различни езици:

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('Часовникът се е преместил назад. Отказвам да генерирам ID');
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// Използване
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Генериран Snowflake ID: ${id}`);
58

Диаграма

Ето визуално представяне на структурата на Snowflake ID:

Времеви печат (41 бита) Идентификатор на машина (10 бита) Последователност (12 бита)

64-битова структура на Snowflake ID

Референции

  1. "Обявяване на Snowflake." Блог на Twitter Engineering, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." Уикипедия, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Разпределено генериране на ID в микросервизи." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f
🔗

Свързани инструменти

Открийте още инструменти, които може да бъдат полезни за вашия работен процес

Генератор на UUID за уникални идентификатори и приложения

Изпробвайте този инструмент

Генератор на уникални и сигурни Нано ID идентификатори

Изпробвайте този инструмент

Генератор на имена за произволни проекти

Изпробвайте този инструмент

Генератор на произволни потребителски агенти за тестване на уеб разработки

Изпробвайте този инструмент

Генератор на произволни API ключове: Създайте сигурни 32-символни низове

Изпробвайте този инструмент

Генератор на ЕГН за тестови цели и валидация на данни

Изпробвайте този инструмент

Генератор на произволни локации: Създаване на глобални координати

Изпробвайте този инструмент

Генератор на MD5 хешове

Изпробвайте този инструмент

Генератор на K-Подредими Уникални Идентификатори (KSUID)

Изпробвайте този инструмент

Генератор на имена за бебета с категории - Намерете перфектното име

Изпробвайте този инструмент