ข้อมูลหลักการประสานงาน

Distributed Lock

ทำให้มั่นใจว่ามีเวิร์กเกอร์เพียงตัวเดียวรันงานในแต่ละครั้ง ด้วยล็อกที่หมดอายุเองและเจ้าของปล่อยได้อย่างปลอดภัย

คำสั่งสำหรับขอล็อก
1
คำสั่งสำหรับปล่อยอย่างปลอดภัย
1
สคริปต์ Lua
0
ขั้นที่ 1 จาก 5
เวิร์กเกอร์ A ขอล็อก

NX ขอก็ต่อเมื่อไม่มีใครถืออยู่ PX 30000 ทำให้หมดอายุใน 30 วินาทีหาก A ตาย

เซสชันตัวอย่างplaying
# เวิร์กเกอร์ A ขอล็อก
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

ตัวอย่างแบบแอนิเมชันพร้อมคำสั่ง HotKV จริงและคำตอบตัวอย่าง คลิกขั้นตอนใดก็ได้เพื่อข้ามไปยังขั้นนั้น คำสั่งและคำตอบยังคงเป็นภาษาอังกฤษ ตรงตามที่คุณพิมพ์และเห็นใน HotKV

ปัญหา

งาน cron บนหลายเครื่อง การเก็บเงินการชำระ และการสร้างแคชใหม่ ต้องไม่รันซ้ำพร้อมกัน ล็อกที่ไม่มีเวลาหมดอายุถูกถือไว้ตลอดไปเมื่อเจ้าของล่ม และการปล่อยล็อกด้วย DEL ธรรมดาอาจลบล็อกของคนอื่นหลังจากล็อกของคุณหมดอายุไปแล้ว

HotKV จัดการอย่างไร

SET พร้อม NX และ PX ขอล็อกก็ต่อเมื่อไม่มีใครถืออยู่ และกำหนดเวลาหมดอายุ เจ้าของที่ล่มจึงถือไว้ตลอดไปไม่ได้ เจ้าของแต่ละรายเก็บโทเค็นสุ่มเป็นค่า DELEX พร้อม IFEQ ลบล็อกก็ต่อเมื่อมันยังถือโทเค็นของคุณ ซึ่งเป็นการปล่อยอย่างปลอดภัยที่เคยต้องใช้สคริปต์ Lua

ทีละขั้นตอน

เกิดอะไรขึ้นบ้าง ทีละคำสั่ง

  1. 01

    เวิร์กเกอร์ A ขอล็อก

    NX ขอก็ต่อเมื่อไม่มีใครถืออยู่ PX 30000 ทำให้หมดอายุใน 30 วินาทีหาก A ตาย

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

    เวิร์กเกอร์ B ถูกปฏิเสธ

    ล็อกถูกถืออยู่ B จึงได้ nil และข้ามรอบนี้

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

    A ทำงาน

    มีเวิร์กเกอร์เพียงตัวเดียวที่รันงานเรียกเก็บเงิน

    PTTL lock:billing-run
  4. 04

    ปล่อยเฉพาะล็อกของตนเอง

    DELEX ลบคีย์ก็ต่อเมื่อค่ายังเป็นโทเค็นของ A

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

    โทเค็นที่ผิดไม่ทำอะไร

    หาก A ช้าเกินไปและตอนนี้ B ถือล็อกอยู่ การปล่อยของ A จะไม่แตะล็อกของ B

    DELEX lock:billing-run IFEQ tok-stale
เหมาะกับงานแบบไหน

สถานการณ์จริง

งานตามกำหนดเวลา

cron เดียวกันรันบนทุกอินสแตนซ์ และล็อกทำให้มั่นใจว่ามีเพียงหนึ่งอินสแตนซ์ที่ทำงาน

การชำระเงิน

การเก็บเงินและการคืนเงินของคำสั่งซื้อเดียวถูกจัดลำดับ จึงไม่ซ้อนทับกัน

การป้องกัน cache stampede

มีเพียงคำขอเดียวที่สร้างรายการแคชที่แพงใหม่ ขณะที่คำขออื่นรอหรือเสิร์ฟค่าที่เก่า

อยู่ในตัว

สิ่งที่คุณได้รับ

ขอล็อกพร้อมเวลาหมดอายุ

SET NX PX ขอล็อกก็ต่อเมื่อว่าง พร้อม timeout

SETNXPX

ปล่อยอย่างปลอดภัย

DELEX IFEQ ลบก็ต่อเมื่อค่าตรงกับโทเค็นของคุณ

DELEX

ต่ออายุขณะทำงาน

ตรวจเวลาที่เหลือและต่ออายุสำหรับงานที่ยาว

PTTLPEXPIRE

เทียบด้วย digest

สำหรับค่าขนาดใหญ่ DELEX IFDEQ เทียบ digest แทนค่าทั้งหมด

DIGESTIFDEQ
ข้อมูลอ้างอิง:SETDELEXDIGEST

คำถามที่พบบ่อย

ทำไมไม่ DEL ล็อกเฉยๆ

หากล็อกของคุณหมดอายุและเวิร์กเกอร์อื่นได้ล็อกไป DEL ธรรมดาจะลบล็อกของเขา DELEX IFEQ ลบมันเฉพาะตอนที่ยังถือโทเค็นของคุณ

ควรตั้งเวลาหมดอายุนานเท่าใด

นานกว่าที่งานปกติใช้ สำหรับงานที่ยาว ให้ต่ออายุเป็นระยะขณะที่คุณยังถือล็อกอยู่

ต้องใช้ Lua เพื่อปล่อยอย่างปลอดภัยไหม

ไม่ต้อง DELEX ทำการเปรียบเทียบและลบในคำสั่งเดียว

กรณีใช้งานที่เกี่ยวข้อง

ลองกับเวิร์กโหลดของคุณเอง

HotKV ใช้โปรโตคอลของ Redis คุณจึงชี้ไคลเอนต์ที่มีอยู่มาที่ HotKV แล้วรันคำสั่งเดียวกันนี้ได้