免责声明:
- 此答案假定您指的是Redis Streams(在 Redis 5.0 中引入)。
我不确定“事件”是什么意思,我在 OP 中评论要求澄清。我将尝试在没有此澄清的情况下回答,并在您澄清概念后编辑我的答案。最后看我的编辑。
Redis Streams 的 ID 也使用顺序 ID,如XADD命令文档中所述:
ID 由两个由 - 字符分隔的数字指定 [...]
两个数量都是 64 位数字。自动生成 ID 时,第一部分是 Redis 实例生成 ID 的 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。
OP编辑问题后编辑
在Redis Streams 简介文档页面的与 Kafka 分区的差异部分中,指出:
如果您使用 1 个流 -> N 个消费者,则您正在对 N 个消费者进行负载平衡,但是在这种情况下,关于同一逻辑项的消息可能会被乱序消费,因为给定的消费者处理消息 3 的速度可能比另一个消费者正在处理的速度快消息 4。
所以基本上 Kafka 分区更类似于使用 N 个不同的 Redis 键。而 Redis 消费者组是从给定流到 N 个不同消费者的消息的服务器端负载平衡系统。
因此,Redis 中的 Consumer Groups 功能与 Kafka 的目的不同。
可以通过使用多个 Redis 键并标记每个使用的订单来进行您想要的分组,但是(AFAIK)Redis 不提供此功能,因此您需要自己实现它。