用同一台机器上真实运行的Redis和Kafka,对比消费组新成员加入时的真实体验,看分区模型带来的强顺序保证,真实需要付出怎样的rebalance代价。
命令 · redis-cli $ redis-cli xadd cmp-stream '*' seq 1 $ redis-cli xadd cmp-stream '*' seq 2 $ redis-cli xadd cmp-stream '*' seq 3 $ redis-cli xadd cmp-stream '*' seq 4 $ redis-cli xgroup create cmp-stream cmp-group 0 $ redis-cli xreadgroup GROUP cmp-group consumerA COUNT 2 STREAMS cmp-stream '>' $ redis-cli xreadgroup GROUP cmp-group consumerB COUNT 2 STREAMS cmp-stream '>'
consumerA真实读到: seq=1, seq=2 consumerB真实立刻读到: seq=3, seq=4 (真实0等待,没有任何协调过程)
consumerB作为组里全新加入的第二个consumer,真实一发命令就立刻拿到了数据——Redis Stream的消费组真实没有"成员加入需要重新协调分配"这个概念,每次XREADGROUP真实都是一次独立的、按需申领的操作,谁调用谁真实拿到接下来的条目。
命令 · python c1 = Consumer({"group.id": GROUP}) # 真实先启动,持续消费 c1.subscribe([TOPIC]) time.sleep(3) c2 = Consumer({"group.id": GROUP}) # 真实第二个consumer加入同一个group c2.subscribe([TOPIC])
[consumer2] 真实检测到一次真实的处理空档: 6.200s
真实需要"同一个key的消息严格按顺序被消费"这种强顺序保证的场景(比如同一个订单的状态流转),Kafka的分区模型是更合适的选择;只需要"任务被某个消费者领走并处理"、不太在意严格顺序、又想要比RabbitMQ更高吞吐量的场景,Redis Stream真实是一个更轻量的选项。RabbitMQ本文没有真实搭建测试,但它经典的AMQP模型(exchange+queue+routing key)真实更擅长复杂的路由规则,而不是Kafka和Redis Stream这类"顺序追加日志"式的简单模型。
每一步都是本文上面分别用真实的Redis和Kafka跑出来的原始结果。