Các giao dịch trong Redis Cluster là một câu chuyện khác với giao dịch với Redis Standalone.
TL; DR;
Đó là một vấn đề khái niệm liên quan đến đảm bảo và đánh đổi hơn là vấn đề khách hàng.
Giải thích
Trong Redis Cluster, một nút cụ thể là nút chính cho một hoặc nhiều vị trí băm, đó là sơ đồ phân vùng để chia nhỏ dữ liệu giữa nhiều nút. Một hash-slot, được tính toán từ các phím được sử dụng trong lệnh, nằm trên một nút. Các lệnh có nhiều phím được giới hạn để mang lại cùng một vị trí băm. Nếu không, chúng sẽ bị từ chối. Những chòm sao như vậy được gọi là khe chéo.
Các giao dịch dường như là giải pháp để thực hiện các lệnh tới các khóa xuyên khe nhưng tại một thời điểm nhất định, người ta sẽ rời khỏi phạm vi của một nút và sẽ cần một nút khác để tiếp tục giao dịch. Điều này có thể xảy ra nếu một khóa nằm trên một nút và khóa khác nằm trên một nút khác. Vẫn không có sự điều phối giao dịch và đó đôi khi có thể là một vấn đề đối với các sự cố của Redis Cluster.
API cấp cao cung cấp hỗ trợ giao dịch cho Redis Cluster phải đối mặt với nhiều vấn đề và có hai chiến lược cho đến nay, cách giải quyết các giao dịch trong Redis Cluster:
Hỗ trợ giao dịch nếu tất cả các khóa nằm trên một nút
Tùy chọn này cho phép các giao dịch có đầy đủ tính năng. Thư viện máy khách được yêu cầu theo dõi nút mà giao dịch được thực hiện và cấm các khóa bên ngoài phạm vi vị trí trong thời gian giao dịch đang diễn ra. Bởi vì vị trí chỉ có thể được xác định bằng cách sử dụng lệnh chứa khóa, khách hàng cần đặt cờ giao dịch và ngay lệnh đầu tiên chứa khóa, lệnh MULTI cần được phát hành, ngay trước lệnh đầu tiên trong giao dịch. Hạn chế ở đây rõ ràng là yêu cầu tất cả các khóa nằm trên một nút.
Giao dịch phân tán
Trong trường hợp này, nhiều giao dịch được bắt đầu trên tất cả các nút tham gia giao dịch phân tán. Giao dịch phân tán này có thể bao gồm các khóa từ tất cả các nút chính. Khi giao dịch được thực hiện, thư viện máy khách sẽ kích hoạt thực hiện giao dịch, thư viện thu thập tất cả các kết quả (để duy trì thứ tự các kết quả lệnh) và trả về cho người gọi.
Phong cách giao dịch này là minh bạch đối với khách hàng. Ngay sau khi một khóa trên một nút cụ thể được yêu cầu và nút đó chưa phải là một phần của giao dịch, một MULTI
lệnh được đưa ra để tham gia nút vào giao dịch. Hạn chế ở đây là các giao dịch không thể có điều kiện nữa (WATCH
). Các giao dịch riêng lẻ không biết liệu một khóa có được thay đổi trên một nút khác hay không và do đó, một giao dịch có thể được khôi phục lại trong khi các giao dịch khác sẽ thành công. Nghe hơi giống cam kết hai pha.
Kết luận
Giao dịch Redis giống như lô lệnh nguyên tử có thể được thực hiện có điều kiện. Điều quan trọng cần nhớ là việc thực thi lệnh bị hoãn lại vì kết quả đọc trả về tại thời điểm thực hiện giao dịch chứ không phải tại thời điểm lệnh được phát hành.
Đối với Redis Cluster, khách hàng chưa quyết định chiến lược toàn cầu. Sẽ an toàn khi chạy các giao dịch trên một nút Redis Cluster cụ thể nhưng bạn bị giới hạn ở các khóa được cung cấp bởi nút đó. Cả hai chiến lược khả thi đều có các thuộc tính có thể hữu ích cho một số trường hợp sử dụng nhất định nhưng cũng có những hạn chế.