Khi đọc số recipe for lock của ZooKeeper, tôi thấy bối rối. Dường như công thức này cho khóa phân phối không thể đảm bảo "bất kỳ ảnh chụp nhanh nào trong thời gian không có hai khách hàng nghĩ rằng chúng giữ cùng một khóa". Nhưng kể từ khi ZooKeeper được áp dụng rộng rãi như vậy, nếu có những sai lầm như vậy trong tài liệu tham khảo, ai đó đã chỉ ra nó từ lâu rồi, vậy tôi đã hiểu lầm điều gì?Những quan tâm về khóa công thức của người sở thú
Trích dẫn the recipe for distributed locks:
Khóa
khóa phân phối đầy đủ được đồng bộ trên toàn cầu, ý nghĩa tại bất kỳ ảnh chụp trong thời gian không có hai khách hàng nghĩ rằng họ giữ cùng khóa. Đây có thể được thực hiện bằng cách sử dụng ZooKeeeper. Giống như các hàng đợi ưu tiên, trước tiên hãy xác định một nút khóa.
- Gọi tạo() với một tên đường dẫn của "locknode/guid-lock-" và trình tự và cờ phù du thiết lập.
- Gọi getChildren() trên nút khóa mà không cần đặt cờ đồng hồ (điều này rất quan trọng để tránh hiệu ứng đàn).
- Nếu tên đường dẫn được tạo ở bước 1 có hậu tố số thứ tự thấp nhất, máy khách có khóa và máy khách thoát khỏi giao thức.
- Cuộc gọi của khách hàng tồn tại() với cờ đồng hồ được đặt trên đường dẫn trong thư mục khóa có số thứ tự thấp nhất tiếp theo.
- nếu tồn tại() trả về false, đi đến bước 2. Nếu không, chờ một thông báo cho tên đường dẫn từ bước trước trước khi đi bước 2.
Hãy xem xét các trường hợp sau đây:
- Client1 đã mua khóa thành công (ở bước 3), với nút ZooKeeper "locknode/guid-lock-0";
- Client2 tạo nút "locknode/guid-lock-1", không thể lấy khóa và hiện đang xem "locknode/guid-lock-0";
- Sau đó, vì một số lý do (ví dụ, tắc nghẽn mạng), Client1 không gửi thông báo nhịp tim đến cụm ZooKeeper đúng giờ, nhưng Client1 vẫn hoạt động, giả sử nhầm rằng nó vẫn giữ khóa.
Nhưng, Zookeeper có thể nghĩ rằng phiên trạm Client1 được timed out, và sau đó
- delete "locknode/guid-lock-0",
- gửi thông báo cho Client2 (hoặc có thể gửi thông báo đầu tiên?),
- nhưng không thể gửi thông báo "hết thời gian chờ" cho Client1 đúng lúc (giả sử do tắc nghẽn mạng).
- Client2 nhận được thông báo, đi lại bước 2, được nút duy nhất "" locknode/guid-lock-1" , mà nó tạo ra bản thân;. Do đó, Client2 giả định nó giữ khóa
- Nhưng tại Đồng thời, Client1 giả định nó giữ khóa.
Đây có phải là kịch bản hợp lệ không?
Thảo luận song song về danh sách gửi thư của _zookeeper-users_: http://thread.gmane.org/gmane.comp.java.hadoop.zookeeper.user/5065 – seh