Bạn đang sử dụng MongoDB để lưu trữ ID. Đó là một trạng thái. Tạo ID là một chức năng. Bạn sử dụng Mongodb để tạo ID khi quy trình mongodb nhận các đối số của hàm và trả về ID đã tạo. Nó không phải là những gì bạn đang làm. Bạn đang sử dụng nodejs để tạo ID.
Số luồng, hay đúng hơn là các vòng lặp sự kiện rất quan trọng vì nó xác định kiến trúc nhưng theo cách nào đó bạn không cần giao dịch. Các giao dịch trong mongodb đang được gọi chính xác là "giao dịch nhiều tài liệu" để làm nổi bật chúng nhằm mục đích cập nhật nhất quán một số tài liệu cùng một lúc. Đoạn đầu tiên của https://docs.mongodb.com/manual/core/transactions / cảnh báo bạn rằng nếu bạn cập nhật một tài liệu thì không có chỗ cho các giao dịch.
Một ứng dụng luồng đơn không yêu cầu bất kỳ đồng bộ hóa nào. Bạn có thể đọc ID được tạo mới nhất một cách đáng tin cậy khi bắt đầu và đảm bảo rằng ID là duy nhất trong quy trình nodejs. Nếu bạn loại trừ mongodb và I / O khác khỏi hàm tạo, bạn sẽ làm cho nó đồng bộ để bạn có thể duy trì trạng thái của ID trong quy trình nodejs và đảm bảo tính duy nhất của nó. Sau khi được tạo, bạn có thể tồn tại trong db một cách không đồng bộ. Trong trường hợp xấu nhất, bạn có thể có khoảng trống trong các số tuần tự nhưng không có trùng lặp.
Nếu có cơ hội nhỏ nhất là bạn có thể cần mở rộng quy mô lên đến hơn 1 quy trình nodejs để xử lý nhiều yêu cầu đồng thời hơn hoặc thêm một máy chủ khác để dự phòng trong tương lai, bạn sẽ cần phải đồng bộ hóa việc tạo ID và bạn có thể sử dụng các chỉ mục duy nhất của Mongodb cho cái đó. Bản thân hàm không thay đổi nhiều, bạn vẫn tạo ID như trong kiến trúc đơn luồng nhưng thêm một bước bổ sung để lưu ID vào mongo. Tài liệu phải có chỉ mục duy nhất trên trường ID, vì vậy trong trường hợp cập nhật đồng thời, một trong các truy vấn sẽ thêm tài liệu thành công và một truy vấn khác sẽ không thành công với "Lỗi khóa trùng lặp E11000". Bạn bắt gặp các lỗi như vậy ở phía nodejs và lặp lại chức năng một lần nữa để chọn số tiếp theo: