RabbitMQ 和 Kafka 到底差在哪?不是谁更好,而是模型不同:队列 vs 日志。这篇在同一台机器上把吞吐、延迟、扇出的存储、重放能力各量一遍,并老实标出哪些数字不能直接比。
RabbitMQ: 4.3.6;Kafka: 4.3.1
两个 broker 都是单节点、本机,客户端语言不同(pika 是纯 Python,librdkafka 是 C),数字主要反映客户端与批量策略,不是 broker 上限的比较。
RabbitMQ 异步 confirm: 1635 ms 61155 条/秒 Kafka acks=all linger.ms=5: 47 ms 2135302 条/秒 Kafka acks=all linger.ms=0: 65 ms 1549576 条/秒
Kafka 追加日志并由客户端批量发送,单节点上发布吞吐比 pika 异步 confirm 的 RabbitMQ 高了 25~35 倍;其中多少来自 broker、多少来自客户端,这里没有拆开。
RabbitMQ(推送 + confirm):p50 0.60 ms,p99 3.37 ms Kafka(acks=all,linger.ms=0,拉取):p50 0.34 ms,p99 5.44 ms
低速率下 p50 都是亚毫秒(0.60 对 0.34 ms),p99 两次运行排名翻转,不下结论。
RabbitMQ(3 个队列各存一份): 数据目录增长 174 MiB Kafka(1 个 topic,3 个 group 共读): 数据目录增长 49 MiB
RabbitMQ 用多个队列做扇出,每个下游存一份;Kafka 的多个消费组共享一份日志。50000 条 1 KB 扇出到 3 个下游:174 MiB 对 49 MiB。
RabbitMQ 经典队列:第一次读 20000 条,第二次读 0 条(消息被 ack 之后就删除了) Kafka:第一个 group 读 20000 条,另一个 group(或重置 offset)再从头读 20000 条(日志保留着,读取不删除)
RabbitMQ 经典队列读完即删,不能重读;Kafka 日志保留,新的消费组可以从头读(RabbitMQ 的 stream 队列也有类似能力)。