常见的消息中间件对比
常见的消息中间件有ActiveMQ、RabbitMQ、RocketMQ、Kafka 等等各种。
ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。它是一个完全支持JMS规范的的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎。
ActiveMQ使用完全支持 JMS1.1 和 J2EE1.4 规范的 JMS Provider 实现,少量代码就可以高效地实现高级应用场景,并且支持可插拔的传输协议,如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。支持常用的多种语言客户端如 C++、Java、.Net,、Python、 Php、 Ruby 等。
现在的 ActiveMQ 分为两个版本:
ActiveMQ Classic,就是原来的 ActiveMQ
ActiveMQ Artemis,在 RedHat 捐赠的 HornetQ 服务器代码的基础上开发的,跟前者代码完全不同,其支持 JMS2.0,使用基于 Netty 的异步 IO,大大提升了性能,不仅支持 JMS 协议,还支持 AMQP 协议、STOMP 以及 MQTT,可以说玩法相当丰富。
RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现,最开始是用在电信业务的可靠通信的。
AMQP的主要特征是面向消息/队列/路由(包括点对点的发布/订阅)可靠性,安全。AMQP协议更多用在企业系统内,对数据一致性/稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
工作过程:生产者发送消息 -> 消息交换机 -> 把消息路由给消息队列 -> 消费者消费消息
优点:
1、轻量级,快速,部署使用方便。
2、支持灵活的路由配置。
RabbitMQ中,在生产者和队列之间有一个交换器模块。根据配置的路由规则,生产者发送的消息可以发送到不同的队列中。路由规则很灵活,还可以自己实现。
3、客户端支持大多数的编程语言。
4、可靠性高。
缺点:
1、性能相对一般。
RabbitMQ的性能在Kafka和RocketMQ中是最差的,每秒处理几万到几十万的消息。如果有大量消息堆积在队列中,性能会急剧下降。如果应用要求高的性能,不要选择RabbitMQ。
2、RabbitMQ是Erlang开发的,功能扩展和二次开发代价很高。
RocketMQ
RocketMQ是阿里开源的消息中间件,使用java实现。具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。
借鉴了Kafka的设计对消息的可靠传输以及事务性做了优化,目前在阿里被广泛应用于交易/充值/流计算/消息推送/日志流式处理/Binlog分发等场景。它刚开始也是依赖zk做集群的,但是觉得太慢就自己开发了Name Server。
特点:
1、保证严格的消息顺序
2、提供针对消息的过滤功能
3、提供丰富的消息拉取模式
4、高效的订阅者水平扩展能力
5、实时的消息订阅机制
6、亿级消息堆积能力
优点:
1、性能稳定性可靠性高。经过了多次双11考验。
2、RocketMQ几乎具备了消息队列应该具备的所有特性和功能。
3、java开发,阅读源代码、扩展、二次开发很方便。
4、对电商领域的响应延迟做了很多优化。在大多数情况下,响应在毫秒级。性能比RabbitMQ高一个数量级,每秒处理几十万的消息。如果应用很关注响应时间,可以使用RocketMQ。
缺点:
1、跟周边系统的整合和兼容不是很好。
Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。一开始的目的是用于日志收集和传输。
Kafka的可靠性,稳定性和功能特性基本满足大多数的应用场景。特点是基于Pull的模式来处理消息消费,追求高吞吐量,0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
特性:
1、快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化
2、高吞吐:在一台普通的服务器上既可以达到 10W/s 的吞吐速率
3、高堆积:支持 topic 下消费者较长时间离线,消息堆积量大
4、完全的分布式系统:Broker、Producer、Consumer 都原生自动支持分布式,通过 Zookeeper 可以自动实现更加复杂的负载均衡
5、支持 Hadoop 数据并行加载
优点:
1、跟周边系统的兼容性是数一数二的,尤其是大数据和流计算领域,几乎所有相关的开源软件都支持Kafka。
2、Kafka高效,可伸缩,消息持久化。
3、支持分区、副本和容错。
4、Kafka是Scala和Java开发的,对批处理和异步处理做了大量的设计,因此Kafka可以得到非常高的性能。它的异步消息的发送和接收是三个中最好的,但是跟RocketMQ拉不开数量级,每秒处理几十万的消息。如果是异步消息,并且开启了压缩,Kafka最终可以达到每秒处理2000w消息的级别。
缺点:
1、由于是异步的和批处理的,延迟也会高,不适合电商场景。