Redis Stream - 事件的顺序保证

标签 redis redis-streams

我用过卡夫卡。在Kafka中,事件的顺序是通过id来保证的。 Redis 中有类似的东西吗?如果我有订单事件流并且消费者组中有多个消费者,则应按顺序处理与一个特定订单相关的所有事件。


事件 - 消息/通知/任何发生的需要宣布的事情。如订单创建事件、订单取消事件。


更清楚地说,

假设 user1 通过 order-service 订购了名为 ABC1 的产品。此订单服务发布采购订单相关 stram。用户1修改/更新订单服务在同一流中发布另一个事件作为第二消息的ABC1的数量。这里消息的 ID 可能不同。 但是,当有多个消费者时,是否能保证这 2 条消息将由消费者组中的 1 个消费者处理?因为这两个消息/事件是相关的并且应该按顺序处理。 Kafka通过使用ABC1产品购买的order-id进行分区来提供保证。

最佳答案

免责声明:

  • 此答案假设您指的是 Redis Streams (Redis 5.0 中引入)。
  • 我不确定你所说的“事件”是什么意思,我在OP中评论要求澄清。我会尝试在不进行澄清的情况下回答,并在您澄清概念后编辑我的答案。请参阅最后我的编辑。

Redis Streams 的 ID 也使用顺序 ID,如 XADD 中所述。命令文档:

IDs are specified by two numbers separated by a - character [...]
Both quantities are 64-bit numbers. When an ID is auto-generated, the first part is the Unix time in milliseconds of the Redis instance generating the ID. The second part is just a sequence number and is used in order to distinguish IDs generated in the same millisecond.
IDs are guaranteed to be always incremental

由于 Redis 服务器是 (mostly) single-threaded ,请求的处理顺序与 Redis 服务器接收请求的顺序相同,并且在最后一个请求得到答复之前不会处理新的请求。

但是,网络问题可能会影响这一点。请考虑以下情况(NETWORK 是指消息传输过程中的情况):

Time    Cli1        Cli2        Redis Server
   1    XADD -----------------> Processing Cli1 Request
   2            NETWORK <------ Answer: ID 1
   3                XADD -----> Processing Cli2 Request
   4                ID 2 <----- Answer: ID 2
   5    ID 1 <--NETWORK

如果 Cli1 和 Cli2 比较他们的答案和接收时间,似乎服务器以错误的顺序处理请求,但对于服务器来说一切正常。
另外,如果服务器正在处理 Cli1 请求时到达 Cli2 请求,则服务器会等到 Cli1 处理完成后才开始处理 Cli2。

OP编辑问题后进行编辑

Differences with Kafka partitions of the Introduction to Redis Streams部分文档页面,指出:

If you use 1 stream -> N consumers, you are load balancing to N consumers, however in that case, messages about the same logical item may be consumed out of order, because a given consumer may process message 3 faster than another consumer is processing message 4.

So basically Kafka partitions are more similar to using N different Redis keys. While Redis consumer groups are a server-side load balancing system of messages from a given stream to N different consumers.

因此,Redis 中的消费者组功能与 Kafka 的目的不同。

可以通过使用多个 Redis 键并标记每个消费订单来进行您想要的分组,但是(据我所知)Redis 不提供此功能,因此您需要自己实现。

关于Redis Stream - 事件的顺序保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61253082/

相关文章:

Redis流: groups/consumers naming and cleanup

Redis 流分区

ruby-on-rails - rails hiredis undefined symbol

docker - 通过 kubernetes 将 Flask 容器连接到 Redis 容器

csv - 使用散列数据类型将 csv 导入到 redis

redis - ZSCAN 保证迭代期间分数发生变化的元素

python - 将 Redis Streams 输出转换为 Pandas Dataframe

redis - 从Redis流中删除一系列条目

node.js - Node Redis XREAD 阻塞订阅

c# - 将 String[] 数组转换为 RedisKey[] 数组