redis事件流顺序保证

1dkrff03  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(754)

我用过Kafka。在Kafka,事件的顺序是通过使用id来保证的。我们在redis中有类似的东西吗?如果在一个消费者组中有order-events流和多个消费者,那么应该按顺序处理与一个特定订单相关的所有事件。
事件-需要宣布的消息/通知/发生的任何事情。与订单创建事件、订单取消事件类似。
更清楚地说,
假设user1通过order service订购了一个名为1的产品。此订单服务发布 purchase-order-related 斯特拉姆。user1修改/更新1的数量,order服务为其在同一流中发布另一个事件作为第二条消息。这里的消息id可能不同。但是,当有多个消费者时,是否可以保证这两条消息将由一个消费者组中的一个消费者处理?因为这两个消息/事件是相关的,应该按顺序处理。kafka通过使用1产品购买的订单id进行分区来提供保证。

gpfsuwkq

gpfsuwkq1#

免责声明:
这个答案假设您引用的是redis流(redis 5.0中引入)。
我不知道你所说的“事件”是什么意思,我在评论中要求澄清。我会尽量回答没有这个澄清和编辑我的答案,一旦你澄清的概念。最后看我的编辑。
redis streams的id也使用顺序id,如xadd命令文档中所述:
ID由两个由-字符[…]分隔的数字指定
这两个量都是64位数字。自动生成id时,第一部分是生成id的redis示例的unix时间(以毫秒为单位)。第二部分只是一个序列号,用于区分在同一毫秒内生成的id。
ID保证总是增量的
由于redis服务器(大部分)是单线程的,所以请求的处理顺序与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。

编辑后编辑编辑问题

在redis streams文档介绍页面的“与kafka分区的区别”一节中指出:
如果使用1个流->n个使用者,则会对n个使用者进行负载平衡,但是在这种情况下,有关同一逻辑项的消息可能会被无序使用,因为给定的使用者处理消息3的速度可能比另一个使用者处理消息4的速度快。
所以基本上kafka分区更类似于使用n个不同的redis密钥。而redis用户组是一个服务器端负载平衡系统,它将给定流中的消息传递给n个不同的用户。
因此,redis中的消费群体特征与kafka的不同。
通过使用多个redis键并标记每个已消费订单,您可以进行所需的分组,但是(afaik)redis不提供此功能,因此您需要自己实现它。

相关问题