消息中间件的比较
消息中间件的比较
1.前言
消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的activeMQ,rabbitmq,炙手可热的kafka,阿里巴巴自主研发的rocketmq等。接下来就来看看以下的比较
2. ActiveMQ 介绍
ActiveMQ是Apache出品,ActiveMQ是一个完全支持JMS1.1和J2EE 1.4 规范的JMS Provider实现。它非常快速,支持多种语言的客户端和协议,而且考研非常容易的嵌入到企业的应用环境中,具有很多高级功能。
特点:
- ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,并且它是一个完全支持JMS规范的消息中间件
- 其丰富的API、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛
- MQ衡量指标:服务性能、数据存储、集群架构
ActiveMQ选择用的比较少,因为ActiveMQ相比其他的MQ的性能来说比较一般。现如今高并发、大数据的应用场景随处可见。如果这时侯在MQ的选择上,那么ActiveMQ就显得力不从心了。
衡量一个MQ的指标,主要有三个方面:服务性能、数据存储、集群架构
- 服务性能:ActiveMQ的性能不是特别好,面对超大规模并发的时候,总会出现各种各样的小问题,比如阻塞,消息堆积过多,产生一些延迟等等一些问题
- 数据储存:ActiveMQ默认采用KahaDB内存存储方式。也可以采用一些高性能的存储方式,比如geogle的LevelDb基于内存的
- 集群架构:ActiveMQ流行那么多年,与其他组件集成的api也是十分完善的。如果不是特别大的并发情况下,ActiveMQ是一个不错的选择。
3. kafka介绍
kafka是LinkedIn开源的分布式发布-定于消息系统,目前归属于Apache顶级项目。Kafka主要特点是给予Pull模式来处理消费消息,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格的要求,适合产生大量数据的互联网的数据收集业务。这里可以看出kafka只关注吞吐量。因此,在使用kafka的时候,注意业务是否允许消息重复、丢失、错误等。如果允许的话,kafka是最合适的。因为它的性能是最高的。即使在廉价的服务器上,也能支持淡季每秒100k条以上的数据量。所以说它的性能是非常好的。kafka仅仅使用内存进行存储,只要有足够的内存,就能够有足够大的吞吐量。因为kafka并没有在磁盘上进行读写。
- 快速持久化:可以在O(1)的系统开销下进行消息持久化
- 高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率
- 完全的分布式系统:Broker、Producer和Consumer都原生自动支持分布式,自动实现负载均衡
- 支持同步和异步复制两种高可用机制
- 支持数据批量发送和拉取
- 零拷贝技术:减少IO操作步骤,提高吞吐量
- 数据迁移、扩容对用户透明
- 无需停机即可扩展机器
- 其他特性:丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制
4. rocketMQ
RocketMQ是阿里开源的消息中间件,目前已经孵化为Apache顶级项目。用Java语言实现,在设计时参考了Kafka,并做出了自己的一些改进,消息可靠性比Kafka更好。RocketMQ在阿里内部被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理等并发场景。
核心特点如下:
- 保证了消息的顺序性,消息按顺序消费
- 提供了丰富的拉取和处理模式
- 高效的订阅者,也可以进行水平扩展
- 承载了上亿级别的消息堆积能力
优点:
- 单机支持1万以上持久化队列
- RocketMQ的所有消息都是持久化的,先写入系统PAGECACHE,然后刷盘,可以保证内存与磁盘都一份数据。而访问时直接从内存读取
- 模型简单,接口易用
- 性能非常好,可以允许大量堆积消息在Broker中
- 支持多种消费模式,包括集群消费、广播消费等
- 各个环节分布式扩展设计,支持主从和高可用
缺点:
- 支持的客户端语言不多,目前是java及c++,其中c++还不成熟
- 维护RocketMQ需要专业的团队
- 商业版收费,有许多功能是不对外提供的。
- 没有在MQ核心里实现JMS等接口
5.RocketMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。
AMQP的主要特征是面向消息、队列、路由、可靠性、安全。
AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
RabbitMQ的可靠性是非常好的,数据能够保证百分之百不丢失。可以使用镜像队列,它的稳定性非常好。所以说在互联网的金融行业,对数据的稳定性和可靠性要求都非常高的情况下,我们都会选择RabbitMQ。当然性能没有kafka好,但比ActiveMQ性能要好很多。
原文参考:https://www.cnblogs.com/coder-programming/p/11364322.html