【问题标题】:Redis Stream - Order Guarantee of the eventsRedis Stream - 事件的订单保证
【发布时间】:2020-07-29 20:38:46
【问题描述】:

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


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


为了更清楚,

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

【问题讨论】:

  • “事件的顺序”到底是什么意思?什么是事件?而在“与一个特定订单相关的所有事件都应按顺序处理”中,“一个特定订单”是什么意思?

标签: redis redis-streams


【解决方案1】:

免责声明:

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

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

ID 由两个用 - 字符分隔的数字指定 [...]
这两个数量都是 64 位数字。自动生成 ID 时,第一部分是 Redis 实例生成 ID 的 Unix 时间(以毫秒为单位)。第二部分只是一个序列号,用于区分同一毫秒内生成的 ID。
保证 ID 始终递增

由于 Redis Server 是(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 比较他们的答案和接收时间,似乎服务器以错误的顺序处理请求,但对于服务器来说一切正常。
另外,如果 Cli2 请求在服务器正在处理 Cli1 请求时到达,它会等到 Cli1 处理完成后再开始处理 Cli2。

在 OP 编辑​​问题后编辑

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

如果您使用 1 个流 -> N 个消费者,则您正在对 N 个消费者进行负载平衡,但是在这种情况下,关于同一逻辑项的消息可能会被乱序消费,因为给定的消费者可能比另一个消费者更快地处理消息 3消费者正在处理消息 4。

所以基本上 Kafka 分区更类似于使用 N 个不同的 Redis 键。而 Redis 消费者组是从给定流到 N 个不同消费者的消息的服务器端负载平衡系统。

因此,Redis 中的 Consumer Groups 功能与 Kafka 的用途不同。

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

【讨论】:

  • 更新了问题。请检查。很抱歉您误解了这个问题。
  • 我更新了我的答案以反映您的更新@RamPrakash。感谢您的澄清。
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多