ข้อมูลหลักเรียลไทม์

แชตและการแจ้งเตือนแบบเรียลไทม์

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

การเผยแพร่ ถึงผู้สมัครรับทุกราย
1
แชนเนลสำหรับคลัสเตอร์
แบบชาร์ด
ด้วยสตรีม
+ประวัติ
ขั้นที่ 1 จาก 5
เซิร์ฟเวอร์สมัครรับ

เซิร์ฟเวอร์ WebSocket แต่ละตัวสมัครรับห้องที่ผู้ใช้ที่เชื่อมต่ออยู่ของมันอยู่

เซสชันตัวอย่างplaying
# เซิร์ฟเวอร์สมัครรับ
hotkv> SUBSCRIBE room:42
1) "subscribe"
2) "room:42"
3) (integer) 1

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

ปัญหา

ห้องแชตหรือฟีดการแจ้งเตือนสดต้องไปถึงผู้ใช้ที่เชื่อมต่ออยู่ทุกคนพร้อมกัน ข้ามเซิร์ฟเวอร์ WebSocket จำนวนมาก การโพลฐานข้อมูลช้าเกินไปและแพงเกินไป และเซิร์ฟเวอร์ต้องมีวิธีร่วมกันที่จะบอกกันว่ามีบางอย่างเกิดขึ้น

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

เซิร์ฟเวอร์ WebSocket แต่ละตัวสมัครรับแชนเนลที่ผู้ใช้ของมันสนใจ เมื่อมีอะไรเกิดขึ้น PUBLISH ครั้งเดียวไปถึงทุกเซิร์ฟเวอร์ที่สมัครรับ ซึ่งส่งต่อให้ผู้ใช้ของตน แชนเนลแบบชาร์ดคงทราฟฟิกไว้บนโหนดที่เป็นเจ้าของแชนเนลในคลัสเตอร์ และสตรีมข้างแต่ละห้องเก็บประวัติสำหรับผู้ใช้ที่เข้าร่วมทีหลัง

ทีละขั้นตอน

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

  1. 01

    เซิร์ฟเวอร์สมัครรับ

    เซิร์ฟเวอร์ WebSocket แต่ละตัวสมัครรับห้องที่ผู้ใช้ที่เชื่อมต่ออยู่ของมันอยู่

    SUBSCRIBE room:42
  2. 02

    Alice ส่งข้อความ

    เซิร์ฟเวอร์ของเธอเผยแพร่ครั้งเดียว คำตอบคือจำนวนผู้สมัครรับที่ได้รับข้อความ

    PUBLISH room:42 "{\"from\":\"alice\",\"text\":\"Deploy is green\"}"
  3. 03

    เก็บประวัติ

    ข้อความยังถูกต่อท้ายสตรีมของห้อง โดยจำกัดที่ 1000 ข้อความล่าสุด

    XADD room:42:history MAXLEN ~ 1000 * from alice text "Deploy is green"
  4. 04

    Bob เชื่อมต่อใหม่ทีหลัง

    เขาอ่าน 50 ข้อความล่าสุดจากสตรีม แล้วเข้าสู่สดบนแชนเนล

    XREVRANGE room:42:history + - COUNT 50
  5. 05

    แชนเนลแบบชาร์ดในคลัสเตอร์

    ในโหมดคลัสเตอร์ SPUBLISH คงข้อความไว้บนโหนดที่เป็นเจ้าของแชนเนล

    SPUBLISH room:{42}:typing "alice"
เหมาะกับงานแบบไหน

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

แชตทีมและแชตซัพพอร์ต

ข้อความกระจายไปยังทุกเซิร์ฟเวอร์ที่ถือการเชื่อมต่อของสมาชิก และสตรีมให้ผู้มาใหม่ได้ข้อความย้อนหลัง

การแจ้งเตือนสด

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

แอปทำงานร่วมกัน

ตำแหน่งเคอร์เซอร์และตัวบอกการพิมพ์ถูกกระจายบนแชนเนลอายุสั้น

อยู่ในตัว

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

การกระจายออก

การเผยแพร่ครั้งเดียวไปถึงผู้สมัครรับทุกราย

PUBLISHSUBSCRIBE

การสมัครรับแบบรูปแบบ

สมัครรับ room:* เพื่อรับทุกห้อง

PSUBSCRIBE

Sharded pub/sub

แชนเนลอยู่บนโหนดที่เป็นเจ้าของในคลัสเตอร์

SPUBLISHSSUBSCRIBE

ประวัติ

จับคู่แชนเนลกับสตรีมที่จำกัดขนาดสำหรับข้อความที่ผู้ใช้พลาดไป

XADDXREVRANGE
ข้อมูลอ้างอิง:PUBLISHSUBSCRIBESPUBLISHXREVRANGE

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

ข้อความ pub/sub ถูกเก็บไว้ไหม

ไม่ Pub/sub ส่งให้ผู้ที่สมัครรับอยู่ในขณะนั้นเท่านั้น ใช้สตรีมข้างแชนเนลหากผู้ใช้ต้องการประวัติ

ใช้ในคลัสเตอร์ได้ไหม

ได้ ใช้ sharded pub/sub (SPUBLISH, SSUBSCRIBE) เพื่อให้ทราฟฟิกของแต่ละแชนเนลอยู่บนโหนดที่เป็นเจ้าของ

แจ้งเตือนเมื่อคีย์เปลี่ยนได้ไหม

ได้ Keyspace notification เผยแพร่เหตุการณ์เมื่อคีย์เปลี่ยน ดูเอกสารเรื่อง keyspace notification

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

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

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