Kafka vs RabbitMQ vs RocketMQ

Kafka

Kafka 是 LinkedIn于 2010 年 12 月开发并 开源的分布式发布-订阅消息系统, 目前归属于 Apache 顶级项目,是一个高性能跨语言分布式 Publish/Subscribe 消息队列系统。 Kafka 主要特点是基于 Pull 的模式来处理消息消费; 追求高吞吐量,在一台普通的服务器上既可以达到 10W/s 的吞吐速率; 一开始的目的就是用于日志收集和传输,所以实现了消息顺序和海量堆积。 0.8版本开始支持复制, 不支持事务, 对消息的重复、 丢失、 错误没有严格要求, 适合产生大量数据的互联网服务的数据收集业务。
Kafka 自身服务与消息的生产和消费都依赖与 Zookeeper,使用 Scala 语言开发。因为其消息的消费使用客户端 Pull 方式,消息可以被多个客户端消费,理论上消息会重复,但是不会丢失(除非消息过期)。因此比较常用的场景是作为日志传输的消息平台。

RabbitMQ

RabbitMQ 是基于 Erlang 语言编写的开源消息队列,通过 Erlang 的 Actor 模型实现了数据的稳定可靠传输, 基于 AMQP 协议来实现。 AMQP 的主要特征是面向消息、 队列、 路由(包括点对点和发布/订阅) 、 可靠性、 安全。 AMQP 协议更多用在企业系统内, 对数据一致性、 稳定性和可靠性要求很高的场景, 对性能和吞吐量的要求还在其次。官方推荐,如果仅仅是使用 RabbitMQ 的话,建议使用 AMQP 0-9-1 的协议。不过,因为其可扩展性,可以通过插件的形式使用 STOMP、XMPP、AMQP 1.0,还可以通过插件使用 HTTP 这种非消息的传输协议。所以,RabbitMQ 可以说是适应性非常强的一个消息队列中间件了。
RabbitMQ 不仅是协议支持的多,还因为它实现了代理 (Broker) 架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得 RabbitMQ 易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大,如需配置 RabbitMQ 则需要在目标机器上安装 Erlang 环境。
总的来说,RabbitMQ 在数据一致性、稳定性和可靠性方面比较优秀,而且直接或间接的支持多种协议,对多种语言支持良好。但是其性能和吞吐量差强人意,由于 Erlang 语言本身的限制,二次开发成本较高。

RocketMQ

淘宝内部的交易系统使用了淘宝自主研发的 Notify 消息中间件, 使用 Mysql 作为消息存储媒介, 可
完全水平扩容, 为了进一步降低成本, 我们认为存储部分可以进一步优化, 2011 年初, Linkin 开源
了 Kafka 这个优秀的消息中间件, 淘宝中间件团队在对 Kafka 做过充分 Review 之后, Kafka 无限消
息堆积, 高效的持久化速度吸引了我们, 但是同时发现这个消息系统主要定位于日志传输, 对于使用
在淘宝交易、 订单、 充值等场景下还有诸多特性不满足, 为此我们重新用 Java 语言编写了 RocketMQ,
定位于非日志的可靠消息传输(日志场景也 OK) , 目前 RocketMQ 在阿里集团被广泛应用在订单,
交易, 充值, 流计算, 消息推送, 日志流式处理, binglog 分发等场景。

对比
1.Kafka
优点

  • 性能卓越,单机写入TPS约在百万条/秒,最大的优点,就是吞吐量高。
  • 时效性:ms级
  • 可用性:非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
  • 消费者采用Pull方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次;
  • 有优秀的第三方Kafka Web管理界面Kafka-Manager;
  • 在日志领域比较成熟,被多家公司和多个开源项目使用;
  • 功能支持:功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用

缺点:

  • Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长
  • 使用短轮询方式,实时性取决于轮询间隔时间;
  • 消费失败不支持重试;
  • 支持消息顺序,但是一台代理宕机后,就会产生消息乱序;
  • 社区更新较慢;

2.RabbitMQ
RabbitMQ优点:

  • 由于erlang语言的特性,mq 性能较好,高并发;
  • 吞吐量到万级,MQ功能比较完备
  • 健壮、稳定、易用、跨平台、支持多种语言、文档齐全;
  • 开源提供的管理界面非常棒,用起来很好用
  • 社区活跃度高;

RabbitMQ缺点:

  • erlang开发,很难去看懂源码,基本职能依赖于开源社区的快速维护和修复bug,不利于做二次开发和维护。
  • RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重。
  • 需要学习比较复杂的接口和协议,学习和维护成本较高。

3.RocketMQ
RocketMQ优点:

  • 单机吞吐量:十万级
  • 可用性:非常高,分布式架构
  • 消息可靠性:经过参数优化配置,消息可以做到0丢失
  • 功能支持:MQ功能较为完善,还是分布式的,扩展性好
  • 支持10亿级别的消息堆积,不会因为堆积导致性能下降
  • 源码是java,我们可以自己阅读源码,定制自己公司的MQ,可以掌控

RocketMQ缺点:

  • 支持的客户端语言不多,目前是java及c++,其中c++不成熟;
  • 社区活跃度一般
  • 没有在 mq 核心中去实现JMS等接口,有些系统要迁移需要修改大量代码

总结:RabbitMQ 大而稳,Kakfa 和 RocketMQ 快而强劲。RocketMQ 虽然目前还很多不完善,但是一旦在 Apache 孵化成为顶级项目,全球程序猿开始贡献,前途也是不可限量的。

推荐阅读https://blog.csdn.net/belvine/article/details/80842240

你可能感兴趣的:(中间件,rabbitmq,kafka,分布式)