Генерація та аналіз інструменту Twitter Snowflake ID для отримання інсайтів
Генеруйте та аналізуйте Twitter Snowflake ID, унікальні 64-бітні ідентифікатори, що використовуються в розподілених системах. Цей інструмент дозволяє вам створювати нові Snowflake ID та аналізувати існуючі, надаючи інсайти про їхній часовий штамп, ID машини та компоненти номеру послідовності.
Генератор Snowflake ID
Генератор Snowflake ID
Документація
Генератор ID Snowflake: Створення Унікальних Ідентифікаторів Розподілених Систем
Що таке генератор ID Snowflake?
Генератор ID Snowflake створює унікальні ідентифікатори для розподілених систем, спочатку розроблений Twitter для обробки даних в масштабах. Цей потужний генератор унікальних ID виробляє 64-бітні цілі числа, що складаються з мітки часу, ID машини та номера послідовності, забезпечуючи унікальність у розподілених системах без координації між серверами.
Наш безкоштовний онлайн-інструмент генератора ID Snowflake дозволяє вам генерувати та розбирати ID Snowflake миттєво, що робить його ідеальним для розробників, які працюють з мікросервісами, розподіленими базами даних та додатками з високою пропускною здатністю.
Як працює генерація ID Snowflake
ID Snowflake — це 64-бітні цілі числа з ретельно спроектованою структурою, яка гарантує унікальність:
- 41 біт: Мітка часу (мілісекунди з моменту початку епохи)
- 10 біт: ID машини (5 біт для ID дата-центру, 5 біт для ID робочого процесу)
- 12 біт: Номер послідовності
Ця структура розподіленого ID дозволяє генерувати приблизно 4,096 унікальних ID за мілісекунду на машину, що робить її ідеальною для розподілених систем з високою пропускною здатністю.
Як використовувати наш інструмент генератора ID Snowflake
Слідуйте цим простим крокам, щоб згенерувати унікальні ID Snowflake:
- Встановіть власну епоху (необов'язково): Використовуйте стандартну епоху Twitter (2010-11-04T01:42:54.657Z) або встановіть свою
- Налаштуйте ID машин: Введіть ID машини (0-31) та ID дата-центру (0-31)
- Генерувати ID: Натисніть "Генерувати", щоб створити новий унікальний ID Snowflake
- Переглянути результати: Дивіться згенерований ID та його складові
Розбір існуючих ID Snowflake
Щоб декодувати ID Snowflake, введіть його в поле "Розібрати ID" та натисніть "Розібрати", щоб побачити його мітку часу, ID машини та компоненти послідовності.
Формула генерації ID Snowflake
Алгоритм 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 за мілісекунду
Процес обчислення ID Snowflake
Алгоритм генерації ID Snowflake слідує цим точним крокам:
- Отримати поточну мітку часу: Отримати поточний час у мілісекундах
- Забезпечити хронологічний порядок: Перевірити, чи мітка часу перевищує останню використану мітку часу
- Обробка тієї ж мітки часу: Якщо мітка часу збігається з попередньою, збільшити номер послідовності
- Запобігти переповненню: Якщо послідовність досягає 4096, почекати наступну мілісекунду
- Об'єднати компоненти: Використовувати побітові операції для створення фінального унікального ID
Цей процес гарантує монотонно зростаючі ID в межах кожної машини, зберігаючи глобальну унікальність у розподілених системах.
Використання ID Snowflake та його застосування
ID Snowflake відмінно підходять для різних сценаріїв розподілених обчислень:
Основні випадки використання
- Розподілені системи: Генерувати унікальні ID на кількох машинах без координації
- Обробка даних великого обсягу: Створювати сортувальні ID для масивів даних
- Архітектура мікросервісів: Забезпечити унікальні ідентифікатори для різних сервісів
- Шардинг бази даних: Використовувати компоненти мітки часу або ID машини для ефективного розподілу даних
Реальні застосування
- Соціальні медіа платформи: Twitter, Instagram для ID постів та користувачів
- Системи електронної комерції: Відстеження замовлень та управління запасами
- Збір даних IoT: Логування подій пристроїв та дані сенсорів
- Фінансові системи: Обробка транзакцій та аудиторські сліди
Альтернативи ID Snowflake та порівняння
Хоча ID Snowflake є потужними, інші системи генерації унікальних ID включають:
Альтернативні системи ID
- UUID (Універсальний Унікальний Ідентифікатор): Найкраще підходить для розподіленої генерації без вимог до сортування
- Автоінкрементні ID бази даних: Проста рішення, обмежене до окремих екземплярів бази даних
- ULID (Універсальний Унікальний Лексикографічно Сортований Ідентифікатор): Схожий на Snowflake з кодуванням base32
- NanoID: Компактний, безпечний для URL генератор унікальних рядків для веб-додатків
Обмеження та міркування щодо ID Snowflake
Розуміння обмежень ID Snowflake допомагає в правильній реалізації:
Загальні виклики
- Проблеми синхронізації годинників: Залежності системного часу можуть викликати проблеми з корекцією NTP або змінами літнього часу
- Обмеження року 2079: Переповнення 41-бітної мітки часу вимагає довгострокового планування для систем великого масштабу
- Управління ID машин: Забезпечення унікальних ID машин у великих розподілених системах вимагає координації
- Переповнення послідовності: Надзвичайно високі сценарії пропускної здатності можуть вичерпати 4096 послідовностей за мілісекунду
- Порядок між машинами: ID є монотонними для кожної машини, але не глобально для всіх машин
Історія ID Snowflake
ID Snowflake були представлені Twitter у 2010 році для вирішення проблеми генерації розподілених, сортованих за часом унікальних ідентифікаторів у масштабах. Коли база користувачів Twitter та обсяг твітів зросли, традиційні автоінкрементні ID стали недостатніми для їхньої розподіленої архітектури.
Система з тих пір була прийнята великими технологічними компаніями, включаючи Instagram, Discord та безліч інших платформ, які потребують масштабованої генерації ID для розподілених систем.
Приклади коду генератора ID Snowflake
Реалізуйте генерацію 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
1import time
2import threading
3
4class SnowflakeGenerator:
5 def __init__(self, datacenter_id, worker_id, sequence=0):
6 self.datacenter_id = datacenter_id
7 self.worker_id = worker_id
8 self.sequence = sequence
9
10 self.last_timestamp = -1
11 self.epoch = 1288834974657
12
13 self.datacenter_id_bits = 5
14 self.worker_id_bits = 5
15 self.sequence_bits = 12
16
17 self.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)
18 self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)
19
20 self.worker_id_shift = self.sequence_bits
21 self.datacenter_id_shift = self.sequence_bits + self.worker_id_bits
22 self.timestamp_left_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bits
23 self.sequence_mask = -1 ^ (-1 << self.sequence_bits)
24
25 self._lock = threading.Lock()
26
27 def _til_next_millis(self, last_timestamp):
28 timestamp = self._get_timestamp()
29 while timestamp <= last_timestamp:
30 timestamp = self._get_timestamp()
31 return timestamp
32
33 def _get_timestamp(self):
34 return int(time.time() * 1000)
35
36 def next_id(self):
37 with self._lock:
38 timestamp = self._get_timestamp()
39
40 if timestamp < self.last_timestamp:
41 raise ValueError("Годинник рухається назад. Відмовляюся генерувати id")
42
43 if timestamp == self.last_timestamp:
44 self.sequence = (self.sequence + 1) & self.sequence_mask
45 if self.sequence == 0:
46 timestamp = self._til_next_millis(self.last_timestamp)
47 else:
48 self.sequence = 0
49
50 self.last_timestamp = timestamp
51
52 return ((timestamp - self.epoch) << self.timestamp_left_shift) | \
53 (self.datacenter_id << self.datacenter_id_shift) | \
54 (self.worker_id << self.worker_id_shift) | \
55 self.sequence
56
57## Використання
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"Згенерований ID Snowflake: {snowflake_id}")
61
1import java.util.concurrent.locks.Lock;
2import java.util.concurrent.locks.ReentrantLock;
3
4public class SnowflakeGenerator {
5 private final long epoch;
6 private final long datacenterIdBits;
7 private final long workerIdBits;
8 private final long sequenceBits;
9 private final long maxDatacenterId;
10 private final long maxWorkerId;
11 private final long workerIdShift;
12 private final long datacenterIdShift;
13 private final long timestampLeftShift;
14 private final long sequenceMask;
15
16 private long datacenterId;
17 private long workerId;
18 private long sequence = 0L;
19 private long lastTimestamp = -1L;
20
21 private final Lock lock = new ReentrantLock();
22
23 public SnowflakeGenerator(long datacenterId, long workerId) {
24 this.epoch = 1288834974657L;
25 this.datacenterIdBits = 5L;
26 this.workerIdBits = 5L;
27 this.sequenceBits = 12L;
28
29 this.maxDatacenterId = ~(-1L << datacenterIdBits);
30 this.maxWorkerId = ~(-1L << workerIdBits);
31
32 this.workerIdShift = sequenceBits;
33 this.datacenterIdShift = sequenceBits + workerIdBits;
34 this.timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
35 this.sequenceMask = ~(-1L << sequenceBits);
36
37 if (datacenterId > maxDatacenterId || datacenterId < 0) {
38 throw new IllegalArgumentException("datacenterId не може бути більшим за maxDatacenterId або меншим за 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId не може бути більшим за maxWorkerId або меншим за 0");
42 }
43 this.datacenterId = datacenterId;
44 this.workerId = workerId;
45 }
46
47 public long nextId() {
48 lock.lock();
49 try {
50 long timestamp = timeGen();
51 if (timestamp < lastTimestamp) {
52 throw new RuntimeException("Годинник рухається назад. Відмовляюся генерувати id");
53 }
54
55 if (lastTimestamp == timestamp) {
56 sequence = (sequence + 1) & sequenceMask;
57 if (sequence == 0) {
58 timestamp = tilNextMillis(lastTimestamp);
59 }
60 } else {
61 sequence = 0L;
62 }
63
64 lastTimestamp = timestamp;
65
66 return ((timestamp - epoch) << timestampLeftShift) |
67 (datacenterId << datacenterIdShift) |
68 (workerId << workerIdShift) |
69 sequence;
70 } finally {
71 lock.unlock();
72 }
73 }
74
75 private long tilNextMillis(long lastTimestamp) {
76 long timestamp = timeGen();
77 while (timestamp <= lastTimestamp) {
78 timestamp = timeGen();
79 }
80 return timestamp;
81 }
82
83 private long timeGen() {
84 return System.currentTimeMillis();
85 }
86
87 public static void main(String[] args) {
88 SnowflakeGenerator generator = new SnowflakeGenerator(1, 1);
89 long id = generator.nextId();
90 System.out.println("Згенерований ID Snowflake: " + id);
91 }
92}
93
require 'time' class SnowflakeGenerator def initialize(datacenter_id, worker_id, sequence = 0) @datacenter_id = datacenter_id @worker_id = worker_id @sequence = sequence @last_timestamp = -1 @epoch = 1288834974657 @datacenter_id_bits = 5 @worker_id_bits = 5 @sequence_bits = 12 @max_datacenter_id = -1 ^ (-1 << @datacenter_id_bits) @max_worker_id = -1 ^ (-1 << @worker_id_bits) @worker_id_shift = @sequence_bits @datacenter_id_shift = @sequence_bits + @worker_id_bits @timestamp_left_shift = @sequence_bits + @worker_id_bits + @datacenter_id_bits @sequence_mask = -1 ^ (-1 << @sequence_bits) end def next_id timestamp = (Time.now.to_f * 1000).to_i raise 'Годинник рухається назад' if timestamp < @last_timestamp if timestamp == @last_timestamp @sequence = (@sequence + 1) & @sequence_mask timestamp = til_next_millis(@last_timestamp) if @sequence == 0 else @sequence = 0 end @last_timestamp = timestamp ((timestamp - @epoch) <<
Пов'язані Інструменти
Відкрийте більше інструментів, які можуть бути корисними для вашого робочого процесу