ActiveMQ、RabbitMQ、Kafka、RocketMQ优劣势比较和MQ选型

最全MQ消息队列有哪些

那么目前在业界有哪些比较知名的消息引擎呢?如下图所示:

这里面几乎完全列举了当下比较知名的消息引擎,包括:

  1. ZeroMQ
  2. 推特的Distributedlog
  3. ActiveMQ:Apache旗下的老牌消息引擎
  4. RabbitMQ、Kafka:AMQP的默认实现。
  5. RocketMQ
  6. Artemis:Apache的ActiveMQ下的子项目
  7. Apollo:同样为Apache的ActiveMQ的子项目的号称下一代消息引擎
  8. 商业化的消息引擎IronMQ
  9. 以及实现了JMS(Java Message Service)标准的OpenMQ。

其它:
阿里云:消息服务 MNS、微消息队列 MQTT 版(专为移动互联网(MI)、物联网(IoT)领域设计的消息产品)

MQ消息队列的技术应用

  1. 解耦

解耦是消息队列要解决的最本质问题。

  1. 最终一致性

最终一致性指的是两个系统的状态保持一致,要么都成功,要么都失败。

最终一致性不是消息队列的必备特性,但确实可以依靠消息队列来做最终一致性的事情。

  1. 广播

消息队列的基本功能之一是进行广播。

有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。

  1. 错峰与流控

典型的使用场景就是秒杀业务用于流量削峰场景。

ActiveMQ、RabbitMQ、Kafka、RocketMQ的区别

特性 ActiveMQ RabbitMQ RocketMQ kafka
开发语言 java erlang java scala
单机吞吐量 万级 万级 10万级 10万级
时效性 ms级 us级 ms级 ms级以内
可用性 高(主从架构) 高(主从架构) 非常高(分布式架构) 非常高(分布式架构)
功能特性 成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好 基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富 MQ功能比较完备,扩展性佳 只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。

参考资料:

性能对比

RocketMQ、RabbitMQ、Kafka同步发送性能对比 :Kafka > RocketMQ > RabbitMQ

MQ选型

分析业务实际需求、潜在需求,对消息系统的功能性要求有哪些,主要考虑的特性:

特性 RocketMQ MNS RabbitMQ
有序性 全局有序+分区有序 Client内存排序 单Producer+同Exchange/Queue+单消费Channel可保证有序
可靠性
拉取模式 Pull/Push Pull/Push Pull/Push
发送性能 1万 3000(队列模式)、500(主题模式) 1万
优先级队列 不支持 支持 支持
延时队列 支持 支持 非原生支持
接入协议 TCP协议、HTTP协议 标准HTTP RESTful接口 基于AMQP 0-9-1协议传递消息
SDK TCP协议支持Java、C/C++ 以及.NET。HTTP协议支持Java、C++、.NET、Go、Python、Node.js和PHP 多种语言SDK支持,包括C++、Java、C#、Python、PHP、Go等,且不断丰富 支持开源所有语言
延时队列 支持 支持 非原生支持
价格 普通:2元/百万次API请求;事务/顺序/定时消息:5倍计费 2元/百万次API请求 同RocketMQ

RabbitMQ非原生支持延时队列,仅支持消息或队列的TTL超时,但无法灵活实现延时策略, rabbitmq-delayed-message-exchange 插件支持毫秒级延时队列方案,但对性能等影响应全面评估。

如果在云服务选择的话,建议:

  • 要求顺序性:选择RocketMQ
  • 要求优先级:可用RabbitMQ或MNS
  • 要求发送速度:超过5000,选择RocketMQ;低于2000/s,均可
  • 价格上二者相当,按调用次数或套餐包、Topic使用费计费
  • 注意:使用云服务,则必须使用阿里云的云监控来做监控报警

其它建议:

  1. 如果我们业务只是收发消息这种单一类型的需求,而且可以允许小部分数据丢失的可能性,但是又要求极高的吞吐量和高性能的话,就直接选Kafka就行了,就好比我们公司想要收集和传输用户行为日志以及其他相关日志的处理,就选用的Kafka中间件。
  2. 如果自己所处公司业务比较平稳,未来几年内不会出现飞速发展,而且没有什么改源码的特殊需求的话,在面对选择MQ的时候就可以选用RabbitMQ。毕竟如今这样的中小公司也就是这么干的。
  3. 如果自己所处公司发展迅猛,一年经常搞一些特别大的促销秒杀活动,公司技术栈主要是Java语言的话,就直接一步到位选择RocketMQ,这样会省很多事情。

其它建议2:

  1. 中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便。正所谓,成也萧何,败也萧何!他的弊端也在这里,虽然RabbitMQ是开源的,然而国内有几个能定制化开发erlang的程序员呢?所幸,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要。不考虑rocketmq和kafka的原因是,一方面中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka排除。不考虑rocketmq的原因是,rocketmq是阿里出品,如果阿里放弃维护rocketmq,中小型公司一般抽不出人来进行rocketmq的定制化开发,因此不推荐。
  2. 大型软件公司,根据具体使用在rocketMq和kafka之间二选一。一方面,大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发,毕竟国内有能力改JAVA源码的人,还是相当多的。至于kafka,根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。具体该选哪个,看使用场景。

其它建议3:

  1. Kafka

Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。

大型公司建议可以选用,如果有日志采集功能,肯定是首选kafka了。

  1. RocketMQ

天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。

RoketMQ在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择RocketMQ。

  1. RabbitMQ

RabbitMQ :结合erlang语言本身的并发优势,性能较好,社区活跃度也比较高,但是不利于做二次开发和维护。不过,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug。

如果你的数据量没有那么大,小公司优先选择功能比较完备的RabbitMQ。

参考资料:

扩展阅读

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据