核心数据后台任务

事件流

只追加的事件流,支持消费者组、确认机制,并能自动恢复崩溃的消费者遗留的消息。

只追加日志
持久化
每个流的消费者组数
N
崩溃时丢失的消息
0
步骤 1 / 5
发布事件

订单服务追加一个事件,并拿回它的 id。

示例会话playing
# 发布事件
hotkv> XADD orders * type created order 1182 total 49.00
"1790985600123-0"

使用真实 HotKV 命令和示例回复的动画演示。点击任意步骤即可跳转。 命令和回复保持英文,与您在 HotKV 中输入和看到的完全一致。

问题所在

响应事件的服务需要的不只是一个队列。多个彼此独立的消费者都想要同样的事件,每个消费者组需要在多个实例之间分摊工作,而当某个实例手里拿着消息宕机时,必须有人发现并接管这些消息。

HotKV 如何解决

流是一个只追加的日志。每个消费者组独立读取它,把每条消息投递给组内的一个成员,并在该成员确认之前将消息保持为待处理状态。XAUTOCLAIM 把待处理过久的消息交给一个健康的消费者。

逐步演示

逐条命令,看看发生了什么

  1. 01

    发布事件

    订单服务追加一个事件,并拿回它的 id。

    XADD orders * type created order 1182 total 49.00
  2. 02

    两个组,一个流

    账单和发货各有自己的组,各自都会收到这个事件。

    XGROUP CREATE orders billing 0 MKSTREAM
  3. 03

    消费

    一个账单实例为其所在的组读取新消息,在消息到来之前一直阻塞。

    XREADGROUP GROUP billing billing-1 COUNT 10 BLOCK 5000 STREAMS orders >
  4. 04

    确认

    发票创建后,账单服务进行确认,消息离开其待处理列表。

    XACK orders billing 1790985600123-0
  5. 05

    从崩溃中恢复

    一个发货实例手里拿着消息宕机了。空闲 60 秒后,这些消息被一个健康的实例认领。

    XAUTOCLAIM orders shipping shipping-2 60000 0-0 COUNT 25
适用场景

真实场景

订单管道

订单流向账单、发货和分析,每个服务都按自己的节奏读取同一个流。

审计与动态信息流

用户操作被追加到流中,任何需要历史记录的服务都可以重放。

IoT 数据接入

设备消息缓存在流中,由一组随负载伸缩的 worker 处理。

内置功能

您将获得

只追加日志

条目获得按时间排序的 id,可按长度或时间修剪。

XADDXTRIM

消费者组

每个组都能收到所有消息,并在组内成员之间分摊工作。

XGROUPXREADGROUP

确认机制

消息在被确认之前一直保持待处理状态。

XACKXPENDING

自动恢复

空闲过久的消息由另一个消费者认领。

XAUTOCLAIMXCLAIM

常见问题

可以重放旧事件吗?

可以。XRANGE 按 id 读取流的任意部分,新的消费者组也可以从头开始读取。

如何防止流无限增长?

用 XTRIM 修剪,或在 XADD 中使用 MAXLEN 或 MINID 选项。

XADD 能避免重复事件吗?

XADD 支持幂等生产者 id(IDMP),重试的发布不会产生第二个条目。请参阅 XADD 参考。

相关用例

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

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