🛠️

Whiz Tools

Build • Create • Innovate

Snowflake ID Generator for Distributed Systems and Analysis

Tạo và phân tích ID Snowflake của Twitter, các định danh 64-bit duy nhất được sử dụng trong các hệ thống phân tán. Công cụ này cho phép bạn tạo ID Snowflake mới và phân tích các ID hiện có, cung cấp cái nhìn về thành phần thời gian, ID máy và số thứ tự của chúng.

Trình tạo ID Snowflake

Trình tạo ID Snowflake

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

Tài liệu

Trình Tạo ID Snowflake

Giới Thiệu

ID Snowflake là một định danh duy nhất được sử dụng trong các hệ thống phân tán, ban đầu được phát triển bởi Twitter. Công cụ này cho phép bạn tạo và phân tích các ID Snowflake, là các số nguyên 64-bit được cấu thành từ một dấu thời gian, ID máy và số thứ tự.

Cách Hoạt Động Của ID Snowflake

ID Snowflake là các số nguyên 64-bit được cấu trúc như sau:

  • 41 bit: Dấu thời gian (miligiây kể từ một thời điểm tùy chỉnh)
  • 10 bit: ID máy (5 bit cho ID trung tâm dữ liệu, 5 bit cho ID máy chủ)
  • 12 bit: Số thứ tự

Cấu trúc này cho phép tạo ra khoảng 4.096 ID duy nhất mỗi miligiây trên mỗi máy.

Sử Dụng Trình Tạo ID Snowflake

  1. (Tùy chọn) Đặt một thời điểm tùy chỉnh (mặc định là thời điểm của Twitter: 2010-11-04T01:42:54.657Z)
  2. Nhập ID máy (0-31) và ID trung tâm dữ liệu (0-31)
  3. Nhấn "Tạo" để tạo một ID Snowflake mới
  4. ID được tạo và các thành phần của nó sẽ được hiển thị

Để phân tích một ID Snowflake hiện có, nhập nó vào trường "Phân Tích ID" và nhấn "Phân Tích".

Công Thức

ID Snowflake được xây dựng bằng cách sử dụng các phép toán bitwise:

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

Trong đó:

  • timestamp là số miligiây kể từ thời điểm
  • datacenterId là một số nguyên 5 bit (0-31)
  • workerId là một số nguyên 5 bit (0-31)
  • sequence là một số nguyên 12 bit (0-4095)

Tính Toán

Trình tạo ID Snowflake thực hiện các bước sau:

  1. Lấy dấu thời gian hiện tại theo miligiây
  2. Đảm bảo rằng dấu thời gian lớn hơn dấu thời gian đã sử dụng cuối cùng (để đảm bảo tính duy nhất)
  3. Nếu dấu thời gian giống như dấu thời gian cuối cùng, tăng số thứ tự
  4. Nếu số thứ tự tràn (đạt đến 4096), chờ đến miligiây tiếp theo
  5. Kết hợp các thành phần bằng cách sử dụng các phép toán bitwise để tạo ra ID cuối cùng

Trường Hợp Sử Dụng

ID Snowflake đặc biệt hữu ích trong:

  1. Hệ Thống Phân Tán: Tạo ID duy nhất trên nhiều máy mà không cần phối hợp
  2. Dữ Liệu Khối Lượng Lớn: Tạo ID có thể sắp xếp cho các tập dữ liệu lớn
  3. Microservices: Đảm bảo các định danh duy nhất giữa các dịch vụ khác nhau
  4. Chia Tách Cơ Sở Dữ Liệu: Sử dụng thành phần dấu thời gian hoặc ID máy cho việc chia tách hiệu quả

Các Lựa Chọn Thay Thế

Mặc dù ID Snowflake mạnh mẽ, các hệ thống tạo ID khác bao gồm:

  1. UUID (Định danh duy nhất toàn cầu): Hữu ích khi cần tạo phân tán mà không cần sắp xếp
  2. ID tự tăng trong cơ sở dữ liệu: Đơn giản nhưng giới hạn ở các thể hiện cơ sở dữ liệu đơn
  3. ULID (Định danh duy nhất toàn cầu có thể sắp xếp): Tương tự như Snowflake, nhưng với cấu trúc khác

Các Trường Hợp Cạnh Và Hạn Chế

  1. Đồng Bộ Đồng Hồ: ID Snowflake phụ thuộc vào thời gian hệ thống. Nếu đồng hồ quay ngược do điều chỉnh NTP hoặc thay đổi giờ mùa hè, nó có thể gây ra sự cố trong việc tạo ID.

  2. Vấn Đề Năm 2038: Dấu thời gian 41 bit sẽ tràn vào năm 2079 (giả sử thời điểm của Twitter). Các hệ thống sử dụng ID Snowflake nên lập kế hoạch cho khả năng này.

  3. Va Chạm ID Máy: Trong các hệ thống phân tán lớn, việc đảm bảo ID máy duy nhất có thể gặp khó khăn và có thể yêu cầu phối hợp thêm.

  4. Tràn Số Thứ Tự: Trong các kịch bản có lưu lượng cao cực kỳ, có thể xảy ra tình trạng cạn kiệt 4096 số thứ tự mỗi miligiây, có thể gây ra sự chậm trễ.

  5. Không Đơn Điệu Giữa Các Máy: Mặc dù ID tăng dần trên một máy đơn, chúng có thể không hoàn toàn đơn điệu giữa nhiều máy.

Lịch Sử

ID Snowflake được giới thiệu bởi Twitter vào năm 2010 để giải quyết nhu cầu về các định danh duy nhất có thể sắp xếp theo thời gian trong môi trường phân tán. Chúng đã được nhiều công ty và dự án khác áp dụng và điều chỉnh.

Ví Dụ

Dưới đây là các triển khai của trình tạo ID Snowflake trong nhiều ngôn ngữ khác nhau:

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('Đồng hồ di chuyển ngược. Từ chối tạo 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// Sử Dụng
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`ID Snowflake được tạo: ${id}`);
58

Sơ Đồ

Dưới đây là một biểu diễn hình ảnh của cấu trúc ID Snowflake:

Dấu Thời Gian (41 bit) ID Máy (10 bit) Số Thứ Tự (12 bit)

Cấu Trúc ID Snowflake 64-bit

Tài Liệu Tham Khảo

  1. "Thông Báo Snowflake." Blog Kỹ Thuật Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID Snowflake." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Tạo ID Phân Tán Trong Microservices." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f