🛠️

Whiz Tools

Build • Create • Innovate

Генератор унікальних ID Snowflake для Twitter та систем

Генеруйте та аналізуйте Twitter Snowflake ID, унікальні 64-бітні ідентифікатори, що використовуються в розподілених системах. Цей інструмент дозволяє створювати нові Snowflake ID та розбирати існуючі, надаючи інформацію про їхній часовий штамп, ID машини та номер послідовності.

Генератор ID сніжинки

Генератор ID сніжинки

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

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

Генератор ID Snowflake

Вступ

ID Snowflake — це унікальний ідентифікатор, що використовується в розподілених системах, спочатку розроблений Twitter. Цей інструмент дозволяє генерувати та аналізувати ID Snowflake, які є 64-бітними цілими числами, що складаються з мітки часу, ID машини та номеру послідовності.

Як працюють ID Snowflake

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

  • 41 біт: Мітка часу (мілісекунди з моменту початку епохи)
  • 10 біт: ID машини (5 біт для ID дата-центру, 5 біт для ID робітника)
  • 12 біт: Номер послідовності

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

Використання генератора ID Snowflake

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

Щоб проаналізувати існуючий ID Snowflake, введіть його у поле "Аналіз ID" та натисніть "Аналізувати".

Формула

ID Snowflake складається з бітових операцій:

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

Де:

  • timestamp — це кількість мілісекунд з моменту епохи
  • datacenterId — це 5-бітне ціле число (0-31)
  • workerId — це 5-бітне ціле число (0-31)
  • sequence — це 12-бітне ціле число (0-4095)

Обчислення

Генератор ID Snowflake виконує наступні кроки:

  1. Отримати поточну мітку часу в мілісекундах
  2. Переконатися, що мітка часу більша за останню використану мітку часу (для унікальності)
  3. Якщо мітка часу така ж, як остання, збільшити номер послідовності
  4. Якщо номер послідовності переповнюється (досягає 4096), почекати наступної мілісекунди
  5. Об'єднати компоненти за допомогою бітових операцій, щоб створити фінальний ID

Використання

ID Snowflake особливо корисні в:

  1. Розподілених системах: Генерувати унікальні ID на кількох машинах без координації
  2. Високих обсягах даних: Створювати впорядковані ID для великих наборів даних
  3. Мікросервісах: Забезпечити унікальні ідентифікатори для різних сервісів
  4. Шардингу бази даних: Використовувати компонент мітки часу або ID машини для ефективного шардингу

Альтернативи

Хоча ID Snowflake потужні, інші системи генерації ID включають:

  1. UUID (Універсальний унікальний ідентифікатор): Корисний, коли потрібна розподілена генерація без впорядкованості
  2. Автоінкрементні ID бази даних: Прості, але обмежені до окремих екземплярів бази даних
  3. ULID (Універсально унікальний лексикографічно впорядкований ідентифікатор): Схожий на Snowflake, але з іншою структурою

Крайні випадки та обмеження

  1. Синхронізація годинників: ID Snowflake покладаються на системний час. Якщо годинник рухається назад через корекції NTP або зміни часу, це може викликати проблеми з генерацією ID.

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

  3. Колізії ID машини: У великих розподілених системах забезпечення унікальних ID машин може бути складним і може вимагати додаткової координації.

  4. Переповнення послідовності: У надзвичайно високих сценаріях пропускної здатності можливо вичерпати 4096 послідовностей за мілісекунду, що може призвести до затримок.

  5. Ненадійність між машинами: Хоча ID є монотонно зростаючими на одній машині, вони можуть не бути строго монотонними між кількома машинами.

Історія

ID Snowflake були представлені Twitter у 2010 році, щоб задовольнити потребу в розподілених, впорядкованих за часом унікальних ідентифікаторах. Вони з тих пір були прийняті та адаптовані багатьма іншими компаніями та проектами.

Приклади

Ось реалізації генераторів ID Snowflake на різних мовах:

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(`Згенерований ID Snowflake: ${id}`);
58

Діаграма

Ось візуальне представлення структури ID Snowflake:

Мітка часу (41 біт) ID машини (10 біт) Послідовність (12 біт)

Структура ID Snowflake на 64 біти

Посилання

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

Супутні інструменти

Відкрийте для себе більше інструментів, які можуть бути корисними для вашого робочого процесу