gpt4 book ai didi

Redis Stream - 事件的顺序保证

转载 作者:行者123 更新时间:2023-12-04 10:12:38 25 4
gpt4 key购买 nike

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

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

为了更清楚,

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

最佳答案

免责声明:

  • 此答案假定您指的是 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 比较他们的答案和接收时间,它 似乎 服务器以错误的顺序处理请求,但对于服务器来说一切正常。
    此外,如果 Cli2 请求在服务器处理 Cli1 请求时到达,它会等到 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 键并标记每个消费顺序来进行您想要的分组,但是(AFAIK)Redis 不提供此功能,因此您需要自己实现。

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

    25 4 0