KafkaRocketMQRabbitMQ的对比
Posted androidstarjack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KafkaRocketMQRabbitMQ的对比相关的知识,希望对你有一定的参考价值。
点击关注公众号,Java干货及时送达👇
概述
消息中间件是基于队列与消息的传递技术,在项目中被我们广泛应用,为系统提供同步或者异步、可靠的消息传输。在分布式、高并发的应用场景中高效、稳定的进行数据交换。有应用解耦、异步消息、最终一致性、流量削峰、广播等特点。
解耦: 将消息写入消息队列,需要消息的系统自己从消息队列中订阅;
异步: 异步方式可以提高执行效率,减少执行时间,生产消息后,无需同步等待消息结果,任务并行处理;
最终一致: 最终一致性不是消息队列的必备特性,但确实可以依靠消息队列来做最终一致性的事情;
流量削峰: 允许消息积压,根据处理能力慢慢处理积压的消息,典型的使用场景就是秒杀业务用于流量削峰场景;
广播: 只需要关心消息是否送达了队列,减少了开发和联调的工作量;
消息队列(Message Queue)
Message Queue消息传送系统提供传送服务。消息传送依赖于大量支持组件,这些组件负责处理连接服务、消息的路由和传送、持久性、安全性以及日志记录。消息服务器可以使用一个或多个代理实例。
JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务
分类
1.点对点:
消息生产者(Producer)生产消息发送到队列(Queue)中,然后消费者(Consumer)从队列中取出并消费消息;
消息被消费后,Queue中不在存储,所有消费者不可能消费到已经被消费的消息。Queue支持存在多个Consumer,但对一个消息而言只会有一个Consumer可以消费。
2.发布/订阅:
消息生产者(Producer)将消息发布到Topic中,同时有多个消费者(Consumer)订阅消费该消息。和点对点方式不同的是,发布到Topic中的消息会被所有订阅者消费。
产品介绍
产 品 | 特点 |
---|---|
ActiveMQ | Apache下的一个子项,类似ZeroMQ,能够以代理人和点对点的技术实现队列。社区不是很活跃。 |
RabbitMQ | 基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。本身支持很多的协议:AMQP,XMPP, SMTP, STOM它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。 |
RocketMQ | 阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。 |
Kafka | 是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务(行为跟踪,日志收集等)。 |
性能对比
特 性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
语言 | Java | Erlang | Java | Scala |
单机吞吐 | 万 | 万 | 十万 | 十万 |
时效性 | ms | us | ms | ms(以内) |
可用性 | 高(主从架构) | 高(主从架构) | 非常高 |
优缺点对比
ActiveMQ
优点:
单机吞吐量:万级;
topic数量都吞吐量的影响;
时效性:ms级;
可用性:高,基于主从架构实现高可用性;
消息可靠性:有较低的概率丢失数据;
功能支持:MQ领域的功能极其完备;
缺点
官方社区现在对ActiveMQ 5.x维护越来越少,较少在大规模吞吐的场景中使用;
RabbitMQ
优点:
由于erlang语言的特性,mq 性能较好,高并发;
吞吐量到万级,MQ功能比较完备;
健壮、稳定、易用、跨平台、支持多种语言、文档齐全;
开源提供的管理界面非常棒,用起来很好用;
社区活跃度高;
缺点
erlang开发,很难去看懂源码,基本职能依赖于开源社区的快速维护和修复bug,不利于做二次开发和维护;
RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重;
需要学习比较复杂的接口和协议,学习和维护成本较高;
RocketMQ
优点:
单机吞吐量:十万级;
可用性:非常高,分布式架构;
消息可靠性:经过参数优化配置,消息可以做到0丢失;
功能支持:MQ功能较为完善,还是分布式的,扩展性好;
支持10亿级别的消息堆积,不会因为堆积导致性能下降;
源码是java,我们可以自己阅读源码,定制自己公司的MQ,可以掌控;
缺点
支持的客户端语言不多,目前是java及c++,其中c++不成熟;
社区活跃度一般;
没有在 mq 核心中去实现JMS等接口,有些系统要迁移需要修改大量代码;
Kafka
优点:
性能卓越,单机写入TPS约在百万条/秒,最大的优点,就是吞吐量高;
时效性:ms级;
可用性:非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用;
消费者采用Pull方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次;
有优秀的第三方Kafka Web管理界面Kafka-Manager;
在日志领域比较成熟,被多家公司和多个开源项目使用;
功能支持:功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用;
缺点:
Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长;
使用短轮询方式,实时性取决于轮询间隔时间;
消费失败不支持重试;
支持消息顺序,但是一台代理宕机后,就会产生消息乱序;
社区更新较慢;
选择建议
产品 | 建议 |
---|---|
Kafka | Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。大型公司建议可以选用,如果有日志采集功能,肯定是首选kafka了。 |
RocketMQ | 天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。RoketMQ在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择RocketMQ。 |
RabbitMQ | 结合erlang语言本身的并发优势,性能较好,社区活跃度也比较高,但是不利于做二次开发和维护。不过,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug。 |
如果你的数据量没有那么大,小公司优先选择功能比较完备的RabbitMQ。|
本文转自 https://www.jianshu.com/p/d2386210fb42,如有侵权,请联系删除。
BAT等大厂Java面试经验总结
想获取 Java大厂面试题学习资料
扫下方二维码回复「BAT」就好了
回复 【加群】获取github掘金交流群
回复 【电子书】获取2020电子书教程
回复 【C】获取全套C语言学习知识手册
回复 【Java】获取java相关的视频教程和资料
回复 【爬虫】获取SpringCloud相关多的学习资料
回复 【Python】即可获得Python基础到进阶的学习教程
回复 【idea破解】即可获得intellij idea相关的破解教程
关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!
如果喜欢就给个“在看”
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖
以上是关于KafkaRocketMQRabbitMQ的对比的主要内容,如果未能解决你的问题,请参考以下文章
高并发架构系列:KafkaRocketMQRabbitMQ的优劣势比较
使用 lm 构建回归模型时出错(`对比<-`中的错误(`*tmp*`...对比只能应用于具有2个或更多级别的因素)[重复]