OK, đây là một câu hỏi rất cũ, mà bây giờ tôi mới thấy lần đầu tiên.
Bạn sẽ cần phân biệt giữa số thứ tự và ID duy nhất có thể sắp xếp lỏng lẻo (tùy chọn) theo một tiêu chí cụ thể (thường là thời gian tạo). Số thứ tự thực sự ngụ ý kiến thức về những gì tất cả những người lao động khác đã làm và như vậy yêu cầu trạng thái được chia sẻ. Không có cách nào dễ dàng để làm điều này một cách phân tán, quy mô cao. Bạn có thể xem xét những thứ như phát sóng mạng, phạm vi cửa sổ cho từng công nhân và bảng băm được phân phối cho các ID công nhân duy nhất , nhưng còn rất nhiều việc.
ID duy nhất là một vấn đề khác, có một số cách tốt để tạo ID duy nhất theo cách phi tập trung:
a) Bạn có thể sử dụng dịch vụ mạng Snowflake ID của Twitter . Snowflake là một:
- Dịch vụ nối mạng, tức là bạn thực hiện cuộc gọi mạng để lấy một ID duy nhất;
- tạo ra các ID duy nhất 64 bit được sắp xếp theo thời gian tạo;
- và dịch vụ có khả năng mở rộng cao và (có khả năng) khả dụng cao; mỗi phiên bản có thể tạo ra nhiều nghìn ID mỗi giây và bạn có thể chạy nhiều phiên bản trên mạng LAN / WAN của mình;
- được viết bằng Scala, chạy trên JVM.
b) Bạn có thể tạo các ID duy nhất trên chính các máy khách, sử dụng phương pháp tiếp cận dựa trên cách tạo UUID và ID của Snowflake. Có nhiều tùy chọn, nhưng một số tùy chọn dọc theo:
40 bit quan trọng nhất hoặc lâu hơn: Dấu thời gian; thời gian tạo ID. (Chúng tôi đang sử dụng các bit quan trọng nhất cho dấu thời gian để làm cho các ID có thể sắp xếp theo thời gian tạo.)
14 bit tiếp theo hoặc lâu hơn: Bộ đếm cho mỗi bộ tạo, mỗi bộ tạo tăng một cho mỗi ID mới được tạo. Điều này đảm bảo rằng các ID được tạo tại cùng một thời điểm (cùng dấu thời gian) không trùng lặp.
Khoảng 10 bit cuối cùng: Một giá trị duy nhất cho mỗi bộ tạo. Sử dụng điều này, chúng tôi không cần phải thực hiện bất kỳ đồng bộ hóa nào giữa các trình phát (điều này cực kỳ khó), vì tất cả các trình tạo đều tạo ra các ID không chồng chéo vì giá trị này.
c) Bạn có thể tạo ID trên các máy khách, chỉ sử dụng dấu thời gian và giá trị ngẫu nhiên. Điều này tránh sự cần thiết phải biết tất cả các trình tạo và gán cho mỗi trình tạo một giá trị duy nhất. Mặt khác, những ID như vậy không được đảm bảo là duy nhất trên toàn cầu, chúng chỉ có khả năng rất cao là duy nhất. (Để va chạm, một hoặc nhiều trình tạo sẽ phải tạo cùng một giá trị ngẫu nhiên chính xác tại cùng một thời điểm.)
- 32 bit quan trọng nhất: Dấu thời gian, thời gian tạo ID.
- 32 bit ít quan trọng nhất: 32 bit ngẫu nhiên, được tạo mới cho mỗi ID.
d) Cách dễ dàng, sử dụng UUID / GUID .