Dữ liệu lõiĐiều phối

Khóa phân tán

Đảm bảo chỉ một worker chạy một công việc tại một thời điểm, với các khóa tự hết hạn và được chủ sở hữu giải phóng một cách an toàn.

lệnh để giành khóa
1
lệnh để giải phóng an toàn
1
script Lua
0
Bước 1 trên 5
Worker A giành khóa

NX chỉ giành nó nếu không ai giữ. PX 30000 khiến nó hết hạn sau 30 giây nếu A chết.

Phiên ví dụplaying
# Worker A giành khóa
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Một hướng dẫn minh họa động với các lệnh HotKV thật và phản hồi ví dụ. Nhấn vào bất kỳ bước nào để nhảy tới đó. Lệnh và phản hồi giữ nguyên bằng tiếng Anh, đúng như bạn gõ và thấy trong HotKV.

Vấn đề

Các cron job trên nhiều máy, việc ghi nhận thanh toán và việc dựng lại cache không được chạy hai lần cùng lúc. Một khóa không có thời hạn sẽ bị giữ mãi khi chủ sở hữu của nó sập, và giải phóng khóa bằng DEL thuần túy có thể xóa khóa của người khác sau khi khóa của bạn đã hết hạn.

HotKV xử lý như thế nào

SET với NX và PX giành một khóa chỉ khi không ai giữ nó, và cho nó thời hạn để chủ sở hữu bị sập không thể giữ nó mãi mãi. Mỗi chủ sở hữu lưu một token ngẫu nhiên làm giá trị. DELEX với IFEQ chỉ xóa khóa nếu nó vẫn giữ token của bạn, đó là cách giải phóng an toàn từng cần đến một script Lua.

Từng bước một

Điều gì xảy ra, từng lệnh một

  1. 01

    Worker A giành khóa

    NX chỉ giành nó nếu không ai giữ. PX 30000 khiến nó hết hạn sau 30 giây nếu A chết.

    SET lock:billing-run tok-a81f NX PX 30000
  2. 02

    Worker B bị từ chối

    Khóa đang được giữ, nên B nhận nil và bỏ qua lượt chạy này.

    SET lock:billing-run tok-b22c NX PX 30000
  3. 03

    A làm việc

    Chỉ một worker chạy công việc thanh toán.

    PTTL lock:billing-run
  4. 04

    Chỉ giải phóng khóa của chính bạn

    DELEX chỉ xóa khóa nếu giá trị vẫn là token của A.

    DELEX lock:billing-run IFEQ tok-a81f
  5. 05

    Token sai không làm gì cả

    Nếu A quá chậm và B đang giữ khóa, việc giải phóng của A sẽ để yên khóa của B.

    DELEX lock:billing-run IFEQ tok-stale
Phù hợp ở đâu

Các tình huống thực tế

Công việc theo lịch

Cùng một cron chạy trên mọi instance, và khóa đảm bảo chính xác một trong số chúng làm việc.

Thanh toán

Các thao tác ghi nhận và hoàn tiền trên một đơn hàng được tuần tự hóa để không bao giờ chồng lấp.

Chống cache stampede

Chỉ một yêu cầu dựng lại một mục cache tốn kém trong khi các yêu cầu khác chờ hoặc phục vụ giá trị cũ.

Tích hợp sẵn

Bạn nhận được gì

Giành khóa với thời hạn

SET NX PX chỉ giành khóa khi nó rảnh, kèm thời gian chờ.

SETNXPX

Giải phóng an toàn

DELEX IFEQ chỉ xóa nếu giá trị khớp token của bạn.

DELEX

Gia hạn khi đang làm việc

Kiểm tra thời gian còn lại và gia hạn cho các công việc dài.

PTTLPEXPIRE

So sánh bằng digest

Với giá trị lớn, DELEX IFDEQ so sánh một digest thay vì toàn bộ giá trị.

DIGESTIFDEQ
Tham chiếu:SETDELEXDIGEST

Câu hỏi thường gặp

Sao không chỉ DEL khóa?

Nếu khóa của bạn đã hết hạn và một worker khác đã giành nó, một DEL thuần túy sẽ xóa khóa của họ. DELEX IFEQ chỉ xóa nó khi nó vẫn giữ token của bạn.

Thời hạn nên dài bao lâu?

Dài hơn thời gian công việc thường mất. Với công việc dài, hãy gia hạn định kỳ khi bạn vẫn giữ khóa.

Tôi có cần Lua để giải phóng an toàn không?

Không. DELEX thực hiện so sánh và xóa trong một lệnh.

Trường hợp sử dụng liên quan

Thử trên khối lượng công việc của chính bạn

HotKV nói giao thức Redis, nên bạn có thể trỏ một client hiện có tới nó và chạy chính những lệnh này.