zoukankan      html  css  js  c++  java
  • Kafka、RabbitMQ、RocketMQ、ActiveMQ消息中间件的对比--多年生产经验实践总结

    引言

    分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注。

    那么,消息中间件性能究竟哪家强?

    带着这个疑问,我们中间件测试组对常见的三类消息产品(Kafka、RabbitMQ、RocketMQ)做了性能比较。

    Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。

    RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

    RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

    测试目的

    对比Kafka、RabbitMQ、RocketMQ发送小消息(124字节)的性能。这次压测我们只关注服务端的性能指标,所以压测的标准是:

    不断增加发送端的压力,直到系统吞吐量不再上升,而响应时间拉长。这时服务端已出现性能瓶颈,可以获得相应的系统最佳吞吐量。

    测试场景

    在同步发送场景中,三个消息中间件的表现区分明显:

    Kafka的吞吐量高达17.3w/s,不愧是高吞吐量消息中间件的行业老大。这主要取决于它的队列模式保证了写磁盘的过程是线性IO。此时broker磁盘IO已达瓶颈。

    RocketMQ也表现不俗,吞吐量在11.6w/s,磁盘IO %util已接近100%。RocketMQ的消息写入内存后即返回ack,由单独的线程专门做刷盘的操作,所有的消息均是顺序写文件。

    RabbitMQ的吞吐量5.95w/s,CPU资源消耗较高。它支持AMQP协议,实现非常重量级,为了保证消息的可靠性在吞吐量上做了取舍。我们还做了RabbitMQ在消息持久化场景下的性能测试,吞吐量在2.6w/s左右。

    测试结论

    在服务端处理同步发送的性能上,Kafka>RocketMQ>RabbitMQ。

    附录:

    测试环境

    服务端为单机部署,机器配置如下:

    应用版本:

    测试脚本

     还有一个rocketmq/rabbitmq/kafka的对比,如下:

     除了上述特性外,rabbitmq和activemq都支持mqtt。activemq还支持ws(不过从tomcat 8开始,ws支持已经足够完善,没有必要为了ws使用rabbitmq或activemq)。

    实践总结

      这些年来,笔者广泛使用过rabbitmq、rocketmq、kafka,几年前主推rabbitmq,现在切换到主推kafka或rabbitmq,看是需要灵活性还是易用(论维护简便性,rabbitmq还是最简单的,虽然它用erlang写的)。

      所以如果不追求极致性能的话(真正要到这个量级的,通常已经有专门的团队专职负责MQ的研究和扩展、运维了,99%的系统都达不到),2c activemq还是比较好的,可以同时支持app端mqtt和web端ws。中规中矩的话可以选择rabbtimq(rabbitmq也有ws插件,使用挺方便),毕竟最正统(这也是在除了日志和数据异步同步场景外使用最广泛的MQ)。如果同时涉及到多种场景,例如日志、同步、异步消息,安装三方库依赖等,推荐使用kafka,也就是最后考虑kafka(它部署更复杂、需要zk,对抖动更敏感)。

      虽然上面没有包含redis,对于一级缓存之间的同步,采用redis消息队列也是一种可接受的方案,即使它不正统,但是某些情况下就是不需要MQ,但是又是集群的时候,redis队列就可以作为退化版MQ使用。

    参考:kafka学习指南(总结版)

    https://www.cnblogs.com/zhjh256/p/6444398.html

    activemq支持的各种协议以及性能:http://haoran-10.iteye.com/blog/2259240

    异步消息传递技术的比较:JMS、AMQP和MQTT http://blog.csdn.net/yongche_shi/article/details/52116755

    web连接activemq ws:D:/apache-activemq-5.15.0/webapps-demo/demo/mqtt/index.html

  • 相关阅读:
    Python之路Day12--mysql介绍及操作
    Python之路第一课Day11--随堂笔记(异步IO数据库队列缓存之二)
    Python之路第一课Day10--随堂笔记(异步IO数据库队列缓存)
    Python之路第一课Day9--随堂笔记之二(进程、线程、协程篇)
    Python之路第一课Day9--随堂笔记之一(堡垒机实例以及数据库操作)未完待续....
    Python之路第一课Day8--随堂笔记(socket 承接上节---网络编程)
    Python之路第一课Day7--随堂笔记(面向对象编程进阶...未完待续 )
    Python之路第一课Day6--随堂笔记(面向对象 )
    Python之路第一课Day5--随堂笔记(模块)
    Python之路第一课Day4--随堂笔记(迭代生成装饰器)
  • 原文地址:https://www.cnblogs.com/zhjh256/p/6985889.html
Copyright © 2011-2022 走看看