核心数据实时

实时聊天与通知

将消息实时分发给每个已连接的客户端,集群使用分片频道,历史记录交给流。

次发布,送达每个订阅者
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

分片 pub/sub

在集群中,频道留在拥有它们的节点上。

SPUBLISHSSUBSCRIBE

历史记录

为频道搭配一个有上限的流,保存用户错过的消息。

XADDXREVRANGE

常见问题

pub/sub 消息会被存储吗?

不会。pub/sub 只投递给那一刻已订阅的对象。如果用户需要历史记录,请在频道旁边使用一个流。

它能在集群中使用吗?

可以。使用分片 pub/sub(SPUBLISH、SSUBSCRIBE),让每个频道的流量留在拥有它的节点上。

键发生变化时可以收到通知吗?

可以。键空间通知会为键的变化发布事件。请参阅关于键空间通知的文档。

相关用例

在您自己的工作负载上试试

HotKV 兼容 Redis 协议,您可以把现有客户端指向它,运行这些相同的命令。