rabbitmq、kafka、activemq、rocketmq之间对比,区别

1. 为何使用消息队列

使用消息队列主要应用于三个场景:解耦、异步、削峰java

1.1 解耦

传统模式:
在这里插入图片描述
传统模式的缺点:程序员

  • 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,若是未来D系统接入,系统A还须要修改代码,过于麻烦!

中间件模式:
在这里插入图片描述
中间件模式的的优势:web

  • 将消息写入消息队列,须要消息的系统本身从消息队列中订阅,从而系统A不须要作任何修改。

1.2 异步

传统模式:数据库

在这里插入图片描述
传统模式的缺点:架构

  • 一些非必要的业务逻辑以同步的方式运行,太耗费时间。

中间件模式:
在这里插入图片描述
中间件模式的的优势:并发

  • 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度

1.3 削峰

传统模式
在这里插入图片描述
传统模式的缺点:异步

  • 并发量大的时候,全部的请求直接怼到数据库,形成数据库链接异常

中间件模式:
在这里插入图片描述
中间件模式的的优势:分布式

  • 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是容许的。

2. 使用了消息队列会有什么缺点?

  • 系统可用性下降:你想啊,原本其余系统只要运行好好的,那你的系统就是正常的。如今你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。所以,系统可用性下降
  • 系统复杂性增长:要多考虑不少方面的问题,好比一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。所以,须要考虑的东西更多,系统复杂性增大。

3. 消息队列如何选项

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

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