kafka 与 rabbitmq

| 分类 PIECE  | 标签 消息中间件 

对比

参数项

对比项 kafka rabbitmq
开发语言 scala, Java erlang
是否支持多租户 2.x.x 支持多租户 支持多租户
是否支持 topic 优先级 不支持 支持
是否支持消息全局有序 不支持 支持
是否支持消息分区有序 支持 支持
是否内置监控 无内置监控 内置监控
是否支持多个生产者 一个 topic 支持多个生产者  
是否支持多个消费者 一个 topic 支持多个消费者  
是否支持一个分区多个消费者 不支持 不支持
是否支持 JMX 支持 不支持(非 Java 语言编写)
是否支持加密 支持 支持
消息队列协议支持 仅支持自定义协议 支持 AMQP、MQTT、STOMP 协议
客户端语言支持 支持多语言客户端 支持多语言客户端
是否支持消息追踪 不支持 支持
是否支持消费者推模式 不支持 支持
是否支持消费者拉模式 支持 支持
是否支持广播消息 支持 支持
是否支持消息回溯 支持消息回溯,因为消息持久化,消息被消费后会记录 offset 和 timstamp 不支持,消息确认被消费后,会被删除
是否支持消息数据持久化 支持 支持
是否支持消息堆积 支持消息堆积,并批量持久化到磁盘 支持阈值内的消息对接,无法支持较大的消息堆积
是否支持流量控制 支持控制用户和客户端流量 支持生产者的流量控制
是否支持事务性消息 支持 不支持
元数据管理 通过 zookeeper 进行管理 支持消息数据持久
默认服务端口 9200 5672
默认监控端口 kafka web console 9000;kafka manager 9000; 15672
网络开销 相对较小 相对较大
内存消耗 相对较小 相对较大
cpu 消耗 相对较大 相对较小

功能项

对比项 Kafka rabbitmq
模型架构 遵从一般的 MQ 结构,producer, broker, consumer,以 consumer 为中心,消息的消费信息保存的客户端 consumer 上,consumer 根据消费的点,从 broker上批量 pull 数据。 遵循 AMQP 协议,RabbitMQ 的 broker 由 Exchange, Binding, Queue组成,其中 Exchange 和 Binding 组成了消息的路由键;客户端 Producer 通过连接 Channel 和 server 进行通信,Consumer 从 Queue 获取消息进行消费(长连接,Queue 有消息会推送到 consumer 端,consumer 循环从输入流读取数据)。rabbitMQ 以 broker 为中心。
消息确认机制 不具有应答机制。 具有生产者 confirm 机制以及消费者的消息应答机制 ack。
消息的顺序 在同一个 partition 中消息是有序的,但是生产者 put 到 Kafka 中数据会分布在不同的 partition 中,所有总体是无序的。 在一个队列里面,rabbitmq 的消息是严格顺序的,按照先进先出。
吞吐量 具有巨大的吞吐量,数据的存储以及获取是本地磁盘的批量处理,可以达到百万/s。 根据测试,在不使用ACK机制的,Msg 大小为 1K 的情况下,QPS 可达6W+。在双方 ACK 机制,Msg大小为1K的情况下,QPS 瞬间降到了 1W+。
可靠性 Kafka 的 broker 支持主备模式。 使用了 MirrorQueue 的机制,也可以做到多个机器进行热备。

实际场景选择

在实际生产应用中,通常会使用 kafka 作为消息传输的数据管道,rabbitmq 作为交易数据作为数据传输管道,主要的取舍因素则是是否存在丢数据的可能;rabbitmq 在金融场景中经常使用,具有较高的严谨性,数据丢失的可能性更小,同事具备更高的实时性;而 kafka 优势主要体现在吞吐量上,虽然可以通过策略实现数据不丢失,但从严谨性角度来讲,大不如 rabbitmq;而且由于 kafka 保证每条消息最少送达一次,有较小的概率会出现数据重复发送的情况。

rabbitmq

  1. RabbitMQ 的消息应当尽可能的小,并且只用来处理实时且要高可靠性的消息。
  2. 消费者和生产者的能力尽量对等,否则消息堆积会严重影响RabbitMQ的性能。
  3. 集群部署,使用热备,保证消息的可靠性。

Kafka

  1. 应当有一个非常好的运维监控系统,不单单要监控 Kafka 本身,还要监控 Zookeeper。( kafka 强烈的依赖于 zookeeper,如果 zookeeper 挂掉了,那么 Kafka 也不行了)
  2. 对消息顺序不依赖,可以作为一个准实时的系统。
  3. 对消息丢失并不那么敏感的系统。
  4. 从 A 到 B 的流传输,无需复杂的路由,最大吞吐量可达每秒 100k 以上。

上一篇     下一篇