trong trường hợp của tôi, hầu hết id sẽ được tạo trong một số lượng lớn máy khách di động, không phải trong một tập hợp giới hạn máy chủ. Tôi tự hỏi liệu trong trường hợp này, có một mối quan tâm chính đáng nào không.
Điều đó nghe có vẻ như là một công trình kiến trúc rất tệ đối với tôi. Bạn có đang sử dụng kiến trúc hai tầng không? Tại sao khách hàng di động có quyền truy cập trực tiếp vào db? Bạn có thực sự muốn dựa vào bảo mật dựa trên mạng không?
Dù sao, một số cân nhắc về xác suất va chạm:
Cả UUID và ObjectId đều không dựa vào kích thước tuyệt đối của chúng, tức là cả hai đều không phải là số ngẫu nhiên, nhưng chúng tuân theo một sơ đồ cố gắng giảm xác suất va chạm một cách có hệ thống. Trong trường hợp của ObjectIds, cấu trúc của chúng là:
- 4 byte giây kể từ kỷ nguyên unix
- Id máy 3 byte
- Id quy trình 2 byte
- Bộ đếm 3 byte
Điều này có nghĩa là, trái với UUID, ObjectIds là monotonic (ngoại trừ trong vòng một giây), đây có lẽ là thuộc tính quan trọng nhất của chúng. Các chỉ mục đơn điệu sẽ khiến B-Tree được lấp đầy hiệu quả hơn, nó cho phép phân trang theo id và cho phép 'sắp xếp mặc định' theo id để làm cho con trỏ của bạn ổn định và tất nhiên, chúng mang dấu thời gian dễ trích xuất. Đây là những cách tối ưu hóa mà bạn nên biết và chúng có thể rất lớn.
Như bạn có thể thấy từ cấu trúc của 3 thành phần còn lại, rất dễ xảy ra va chạm nếu bạn đang thực hiện> 1k lần chèn / s trên một quy trình (không thực sự khả thi, thậm chí không phải từ máy chủ) hoặc nếu số lượng máy tăng lên đã qua khoảng 10 (xem vấn đề ngày sinh) hoặc nếu số lượng quy trình trên một máy tăng quá lớn (xin nhắc lại, đó không phải là số ngẫu nhiên, nhưng chúng thực sự là duy nhất trên một máy, nhưng chúng phải được rút ngắn xuống còn hai byte ).
Đương nhiên, để xảy ra va chạm, chúng phải khớp trong tất cả các khía cạnh này, vì vậy ngay cả khi hai máy có cùng một hàm băm máy, nó vẫn sẽ yêu cầu máy khách chèn cùng một giá trị bộ đếm trong cùng một giây chính xác và cùng một id quy trình, nhưng đúng vậy, các giá trị này có thể xung đột với nhau.