Như bạn đề cập hiện tại không có cách nào sạch sẽ để làm những gì bạn muốn. Cách tiếp cận tốt nhất tại thời điểm này cho các hoạt động như cách bạn cần là:
- Người đọc chọn tài liệu X với giới hạn và phân loại thích hợp
- Trình đọc đánh dấu các tài liệu do 1 trả về) bằng ID trình đọc duy nhất của chính tài liệu đó (
e.g. update({_id:{$in:[<result set ids>]}, state:"available", $isolated:1}, {$set:{readerId:<your reader's ID>, state:"processing"}}, false, true)
) - Reader chọn tất cả các tài liệu được đánh dấu là đang xử lý và với ID người đọc của chính nó. Tại thời điểm này, chúng tôi đảm bảo rằng bạn có quyền truy cập độc quyền vào bộ tài liệu kết quả.
- Cung cấp bộ kết quả từ 3) để bạn xử lý.
Lưu ý rằng điều này thậm chí hoạt động trong các tình huống đồng thời cao vì người đọc không bao giờ có thể đặt trước các tài liệu chưa được người đọc khác đặt trước (lưu ý rằng bước 2 chỉ có thể đặt trước các tài liệu hiện có và các bài viết là nguyên tử). Tôi cũng sẽ thêm dấu thời gian với thời gian đặt trước nếu bạn muốn có thể hết thời gian đặt trước (ví dụ:đối với các tình huống trong đó người đọc có thể gặp sự cố / không thành công).
CHỈNH SỬA:Thêm chi tiết:
Tất cả các hoạt động ghi đôi khi có thể mang lại lợi nhuận cho các hoạt động đang chờ xử lý nếu quá trình ghi diễn ra trong một thời gian tương đối dài. Điều này có nghĩa là bước 2) có thể không thấy tất cả các tài liệu được đánh dấu bởi bước 1) trừ khi bạn thực hiện các bước sau:
- Sử dụng giá trị "w" (ghi mối quan tâm) thích hợp, nghĩa là 1 hoặc cao hơn. Điều này sẽ đảm bảo rằng kết nối mà thao tác ghi được gọi sẽ đợi nó hoàn tất bất kể nó mang lại như thế nào.
- Đảm bảo bạn thực hiện việc đọc ở bước 2 trên cùng một kết nối (chỉ phù hợp với các bản sao có lần đọc được kích hoạt slaveOk) hoặc chuỗi để chúng được đảm bảo là tuần tự. Việc trước có thể được thực hiện trong hầu hết các trình điều khiển bằng phương thức "requestStart" và "requestDone" hoặc tương tự (tài liệu Java tại đây
).
- Thêm cờ biệt lập $ vào nhiều bản cập nhật của bạn để đảm bảo nó không thể bị xen kẽ với các thao tác ghi khác.
Cũng xem các bình luận để thảo luận về tính nguyên tử / sự cô lập. Tôi cho rằng nhiều bản cập nhật đã bị cô lập một cách không chính xác. Chúng không phải, hoặc ít nhất là không phải theo mặc định.