ข้ามไปยังเนื้อหา

Pub/Sub และ Streams: ภาพรวม

Redis มีโมเดลสองแบบที่แตกต่างกันสำหรับส่งข้อความระหว่าง client ทั้งสองตอบโจทย์การใช้งานที่ต่างกัน และไม่สามารถใช้แทนกันได้

Pub/SubStreams
ความคงอยู่ของข้อมูลไม่มี — ข้อมูลหายไปหลังส่งDurable append-only log
ผู้รับที่ออฟไลน์พลาดข้อความทั้งหมดระหว่างที่ตัดการเชื่อมต่อสามารถอ่านย้อนหลังจากตำแหน่งใดก็ได้
การรับประกันการส่งFire-and-forgetAt-least-once ด้วย consumer groups
ประวัติข้อความไม่มีประวัติเก็บประวัติทั้งหมดโดย default
Consumer groupsไม่รองรับรองรับ (การประมวลผลแบบขนาน)
Latency ทั่วไปSub-millisecondSub-millisecond

Pub/Sub ส่งข้อความไปยัง subscriber ที่เชื่อมต่ออยู่ทุกคนของ channel แล้วทิ้งข้อความนั้นไป Streams เพิ่มทุกข้อความต่อท้าย log ที่คงอยู่โดยไม่ขึ้นกับ subscriber ใด

Pub/Sub เหมาะสมเมื่อ:

  • การแจ้งเตือนแบบ real-time — action ของผู้ใช้ต้องถูก broadcast ไปยัง dashboard หรือ browser tab ทันที และการพลาดการอัปเดตครั้งหนึ่งเป็นสิ่งที่ยอมรับได้
  • Live chat — ข้อความไหลผ่านขณะที่ทั้งสองฝ่ายเชื่อมต่ออยู่ โดยประวัติการสนทนาถูกเก็บไว้ที่อื่น
  • Fanout cache invalidation — app server ทุกตัวต้องลบค่าที่ cache ไว้ในเวลาเดียวกัน การพลาดข้อความหมายถึงแค่ cache ที่ล้าสมัยเล็กน้อยซึ่งไม่เป็นปัญหา
  • Event broadcasting — metrics, สัญญาณ presence หรือการอัปเดต state แบบชั่วคราวที่ค่าเก่าไม่มีความหมายเมื่อ subscriber เชื่อมต่อกลับมา

สิ่งที่เหมือนกัน: คุณค่าของข้อความผูกติดกับช่วงเวลาที่ส่ง เมื่อช่วงเวลานั้นผ่านไป ข้อความก็ไม่มีประโยชน์อีก

Streams เหมาะสมเมื่อ:

  • Event sourcing — ทุกการเปลี่ยนแปลง state ต้องถูกบันทึกและเล่นซ้ำได้จากจุดใดก็ได้ในเวลา
  • Task queues — worker ประมวลผลงานและต้องไม่สูญเสีย task หาก worker หยุดทำงานกะทันหัน
  • Audit logs — บันทึกที่สมบูรณ์และเป็นลำดับว่าใครทำอะไร สามารถ query ได้ภายหลัง
  • ผู้รับที่ออฟไลน์ — consumer ที่หยุดทำงานและกลับมาต้องสามารถอ่านทุกอย่างที่พลาดไปได้
  • การประมวลผลแบบขนาน — consumer groups ให้ worker หลายตัวแชร์ stream โดยไม่ duplicate ข้อความ

สิ่งที่เหมือนกัน: ข้อความยังมีความสำคัญแม้จะถูกส่งไปแล้ว คุณต้องการ log

บทเรียนหัวข้อ
ภาพรวม (หน้านี้)Pub/Sub vs Streams — การเลือกโมเดลที่เหมาะสม
Pub/SubSUBSCRIBE, PUBLISH, UNSUBSCRIBE — การสาธิตสองเทอร์มินัล
Pub/Sub PatternsPSUBSCRIBE, PUNSUBSCRIBE — การจับคู่ channel ด้วย glob-pattern
StreamsXADD, XREAD, XRANGE, XLEN — การเขียนและอ่าน stream
Consumer GroupsXGROUP, XREADGROUP, XACK — การประมวลผลแบบขนานพร้อม acknowledgement
127.0.0.1:6379> PUBLISH chat "hello"
(integer) 0

การตอบกลับ (integer) 0 หมายความว่าตอนที่ publish ไม่มี subscriber เชื่อมต่ออยู่เลย เปิด session redis-cli ที่สอง รัน SUBSCRIBE chat แล้ว publish อีกครั้งเพื่อดูการส่งข้อความแบบ live

PUBLISH chat "hello"
subscriber ตัดการเชื่อมต่อ 5 วินาที โมเดลใดรับประกันว่าสามารถอ่านข้อความที่พลาดไปได้?
Redis ทำอะไรกับข้อความ Pub/Sub หลังจากส่งให้ subscriber ที่เชื่อมต่ออยู่แล้ว?
ฟีเจอร์ใดที่มีใน Streams แต่ไม่มีใน Pub/Sub?