这里选择业界比较流行几种消息中间件、ActiveMQ、RabbitMQ、RocketMQ、Kafka等比较有名气的中间件,还有些比较偏门的MQ不在今天的讨论的范围内。
下面对以上几种MQ从几个不同维度来做下总结和对比,希望看完后对你们公司在引入MQ时可以帮助你们做技术选型。
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级,吞吐量要比RocketMQ和Kafka低一个量级 | 万级,吞吐量要比RocketMQ和Kafka低一个量级 | 10万级,是可以支撑高吞吐量的一种MQ | 10万级,Kafka最大的优点就是吞吐量高。一般配合大数据类系统来进行实时计算,日志采集等场景来使用 |
topic数量对吞吐量的影响 | topic可以达到几百,几千的级别,吞吐量会有较小幅度的下降,这也是RocketMQ的一大优势 | topic从几十到达几百时,吞吐量会大幅度下降,所以在同等机器下,kafka尽量保证topic的数量不要过多 | ||
时效性 | ms级别 | 微秒级别,这是RabbitMQ的一大特点,延迟是最低的 | ms级别 | 延迟在ms级别以内 |
可用性 | 高,基于主从架构实现高可用 | 高,基于主从架构实现高可用 | 非常高,分布式架构 | 非常高,kafka是分布式的,一个数据多个副本,少数机器宕机不会数据丢失,不会导致不可用 |
消息可靠性 | 有较低的概率丢失数据 | 经过参数优化陪配置可以做到0丢失 | 经过参数优化配置,可以达到0丢失 | |
核心特点 | MQ领域的功能及其完备 | 基于erlang开发,所以并发性能及其突出,性能好,延迟低 | MQ功能基本完善,分布式的扩展性良好 | 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模的使用,是实时上的标准 |
功能支持 | MQ领域的功能及其完备 | 基于erlang开发,所以并发性能及其突出,性能好,延迟地 | MQ功能基本完善,分布式的扩展性良好 | 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模的使用,是实时上的标准 |
优劣势总结 | 非常成熟,功能强大,在业内大量的公司以及项目中都有应用, 偶尔会有低概率的消息丢失,现在社区以及国内公司使用的越来越少,官方现在对ACtiveMQ 高版本维护越来越少,主要是基于解耦和异步来使用,较少在大规模吞吐的场景使用 | erlang语言开发,性能极好,延迟低而且开源提供管理界面非常棒,用起来非常方便,国内一些互联网公司最近几年使用RabbitMQ的比较多。但是问题也是显而易见的,RabbitMQ确实会吞吐量低一些,这是因为其实现机制比较重,而且erlang开发,国内有几个有实力的公司做erlang源码级别的研究和定制??而且RabbitMQ集群动态扩展比较麻烦,不过这个问题不是太大。 其只要是erlang语言本身带来的问题,很难读源码,定制开发,掌控力度不大 | 接口简单易用,在阿里经过大规模使用,有阿里的品牌保证。日处理消息上百亿之多,可以做到大规模吞吐,性能非常优秀,分布式扩展也很方便,社区维护还可以,可靠性和可用性都是没得说,还可以支撑大规模topic数量,支持复杂的MQ业务场景,而且一个很大的优势在于,阿里出品都是Java系列,我们可以自己读源码,定制自己公司的MQ,可以掌控,社区活跃度相对一般,不过也还可以,文档相对来说简单一些,接口这块不是按照标准的JMS规范走的,有些系统做迁移需要做较大的代码改动,还有就是阿里出台的技术你得做好技术万一别抛弃,社区黄掉的风险,如果公司有一定的技术实力,可以大胆是使用。 | kafka的特点的其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms级别的延迟,极高的可用性和可靠性,分布式架构可以任意扩展,同时kafka最好支撑较少的topic数量,保证其超高的吞吐量,二是kafka唯一的的劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志收集中,这点轻微的影响可以忽略不计。这个特性天然适合大数据实时计算以及日志收集 |
经过上面分析之后大家根据自己的业务都会找到自己合适的消息中间件。
一般在业务系统需要引入MQ时,早期大家都用ActiveMQ,但是现在确实使用的不多了,其没有经过大规模吞吐量场景的验证,社区活跃度也不高,所以大家想想还是算了吧,个人不建议使用。
现在越来越多的公司,都会去使用RocketMQ,这个确实不错,但是得提防社区万一突然黄掉的风险,对自己公司技术实力有绝对信心的,推荐使用RocketMQ,否则还是老老实实的去用RabbitMQ吧,人家是活跃的开源的社区,绝对不会死的。
所以中小型公司,技术实力一般,技术挑战不是特别高,RabbitMQ是一个不错选择,大型公司,基础架构研发实力强,用RocketMQ是很好的选择。
如果是大数据领域的实时计算,日志采集等场景,用kafka是业内标准,绝对没有问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的实时性规范。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。