🛠️

Whiz Tools

Build • Create • Innovate

Генератор идентификаторов Snowflake для распределенных систем

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

Генератор ID Snowflake

Генератор ID Snowflake

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

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

Генератор идентификаторов Snowflake

Введение

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

Как работают идентификаторы Snowflake

Идентификаторы Snowflake представляют собой 64-битные целые числа, структурированные следующим образом:

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

Эта структура позволяет генерировать примерно 4096 уникальных идентификаторов в миллисекунду на одну машину.

Использование генератора идентификаторов Snowflake

  1. (Необязательно) Установите пользовательскую эпоху (по умолчанию используется эпоха Twitter: 2010-11-04T01:42:54.657Z)
  2. Введите идентификатор машины (0-31) и идентификатор дата-центра (0-31)
  3. Нажмите «Сгенерировать», чтобы создать новый идентификатор Snowflake
  4. Сгенерированный идентификатор и его компоненты будут отображены

Чтобы разобрать существующий идентификатор Snowflake, введите его в поле «Разобрать идентификатор» и нажмите «Разобрать».

Формула

Идентификатор Snowflake создается с использованием побитовых операций:

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

Где:

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

Расчет

Генератор идентификаторов Snowflake выполняет следующие шаги:

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

Сценарии использования

Идентификаторы Snowflake особенно полезны в:

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

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

Хотя идентификаторы Snowflake мощны, существуют и другие системы генерации идентификаторов, включая:

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

Краевые случаи и ограничения

  1. Синхронизация часов: Идентификаторы Snowflake зависят от системного времени. Если часы движутся назад из-за корректировок NTP или изменений времени, это может вызвать проблемы с генерацией идентификаторов.

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

  3. Коллизии идентификаторов машин: В больших распределенных системах обеспечение уникальности идентификаторов машин может быть сложной задачей и может потребовать дополнительной координации.

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

  5. Ненаглядность между машинами: Хотя идентификаторы последовательно увеличиваются на одной машине, они могут не быть строго монотонными между несколькими машинами.

История

Идентификаторы Snowflake были представлены Twitter в 2010 году, чтобы решить необходимость в распределенных, сортируемых по времени уникальных идентификаторах. С тех пор они были приняты и адаптированы многими другими компаниями и проектами.

Примеры

Вот реализации генераторов идентификаторов 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('Часы движутся назад. Отказ в генерации идентификатора');
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}`);
58

Диаграмма

Вот визуальное представление структуры идентификатора Snowflake:

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

Структура 64-битного идентификатора Snowflake

Ссылки

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

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

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

Генератор UUID для уникальных идентификаторов и приложений

Попробуйте этот инструмент

Генератор уникальных идентификаторов Nano ID для веба

Попробуйте этот инструмент

Генератор случайных названий проектов

Попробуйте этот инструмент

Генератор случайных пользовательских агентов для тестирования веб-разработки

Попробуйте этот инструмент

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

Попробуйте этот инструмент

Генератор CPF для тестирования и валидации данных

Попробуйте этот инструмент

Генератор случайных локаций: Создатель глобальных координат

Попробуйте этот инструмент

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

Попробуйте этот инструмент

Генератор K-сортируемых уникальных идентификаторов (KSUID)

Попробуйте этот инструмент

Генератор имен для детей с категориями - Найдите идеальное имя

Попробуйте этот инструмент