Theo yêu cầu, đây là bản phác thảo vấn đề của chúng tôi và cách chúng tôi giải quyết nó:
Trong hệ thống của mình, chúng tôi đã tạo quy trình khóa Tài liệu tùy chỉnh (sử dụng redis-lock), trong đó điều sau đây xảy ra theo thứ tự chính xác (không chính xác) này:
THỨ TỰ HOẠT ĐỘNG KHÔNG ĐÚNG:
- Đã nhận được yêu cầu của khách hàng
- Tài liệu bị khóa
- Tài liệu đã được truy xuất
- Tài liệu đã được chỉnh sửa
- Tài liệu đã được mở khóa
- Yêu cầu của khách hàng đã được giải quyết
- Đã lưu tài liệu
Khi bạn thấy nó được viết ra, vấn đề là rõ ràng:chúng tôi đang lưu Tài liệu của mình bên ngoài khóa Tài liệu của chúng tôi.
Giả sử # 6 mất 100ms trong hệ thống của chúng tôi. Đó là cửa sổ 100ms, trong đó nếu có bất kỳ yêu cầu nào khác lấy cùng Tài liệu đó, chúng ta sẽ xảy ra xung đột lưu (lỗi có tiêu đề trong Câu hỏi này về cơ bản là xung đột lưu IMHO).
Nói cách khác / ví dụ:trong hệ thống của chúng tôi, Yêu cầu A nắm lấy Phiên bản 1 của Tài liệu X, chỉnh sửa nó, sau đó mở khóa nó, nhưng trước khi Yêu cầu A lưu Tài liệu, Yêu cầu B đã lấy Tài liệu X và tăng nó lên Phiên bản 2 (đọc trên Mongo phiên bản để biết thêm thông tin về điều này). Sau đó, Yêu cầu A giải quyết yêu cầu của Khách hàng và lưu Tài liệu X, nhưng nó đang cố gắng lưu Phiên bản 1 và bây giờ nó thấy nó có Phiên bản 2, và do đó xảy ra lỗi ở trên.
Vì vậy, việc sửa chữa rất dễ dàng. Lưu Tài liệu của bạn bên trong ổ khóa của bạn. (Trong ví dụ trên, hãy chuyển từ # 7 đến trước # 5. Xem bên dưới.)
THỨ TỰ HOẠT ĐỘNG ĐÚNG / CỐ ĐỊNH
- Đã nhận được yêu cầu của khách hàng
- Tài liệu bị khóa
- Tài liệu đã được truy xuất
- Tài liệu đã được chỉnh sửa
- Đã lưu tài liệu
- Tài liệu đã được mở khóa
- Yêu cầu của khách hàng đã được giải quyết
(Bạn có thể lập luận rằng # 6 và # 7 nên được hoán đổi, nhưng điều đó nằm ngoài phạm vi của Mongo / Mongoose / câu hỏi này.)
Tôi sẽ để câu hỏi này chưa được trả lời trong một thời gian và xem liệu có ai có thể làm sáng tỏ cách tốt hơn để tách mã có liên quan và khắc phục sự cố này không. Trong trường hợp của chúng tôi, đây là một vấn đề rất hệ thống và RẤT khó khăn để khắc phục sự cố đối với trình độ kỹ năng của chúng tôi vào thời điểm đó.