Skip to content

常见消息中间件介绍

1. RocketMQ

阿里旗下开源的一款分布式、队列模型的消息中间件,原名 Metaq,3.0 版本名称改为 RocketMQ,是阿里参照 kafka 设计思想使用 java 实现的一套 mq。同时将阿里系内部多款 mq 产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下 mq 的架构,目前主要多用于订单交易系统。

特性:

  • 能够保证严格的消息顺序
  • 提供针对消息的过滤功能
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力

2. RabbitMQ

使用 Erlang 编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP,STOMP,也正是如此,使得它变的非常重量级,更适合于企业级的开发。同时实现了 Broker 架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由( Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的 ESB 整合。

3. ActiveMQ

Apache 下的一个子项目。使用 Java 完全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ 均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。

4. Redis

使用 C 语言开发的一个 Key-Value 的 NoSQL 数据库,开发维护很活跃,虽然它是一个 Key-Value 数据库存储系统,但它本身支持 MQ 功能,所以完全可以当做一个轻量级的队列服务来使用。对于 RabbitMQ 和 Redis 的入队和出队操作,各执行 100 万次,每 10 万次记录一次执行时间。测试数据分为 128Bytes、512Bytes、1K 和 10K 四个不同大小的数据。实验表明:入队时,当数据比较小时 Redis 的性能要高于 RabbitMQ,而如果数据大小超过了 10K,Redis 则慢的无法忍受;出队时,无论数据大小,Redis 都表现出非常好的性能,而 RabbitMQ 的出队性能则远低于 Redis。

5. kafka

Apache 下的一个子项目,使用 scala 实现的一个高性能分布式 Publish/Subscribe 消息队列系统。

特性:

  • 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在 O(1) 的系统开销下进行消息持久化
  • 高吞吐:在一台普通的服务器上既可以达到 10W/s 的吞吐速率
  • 高堆积:支持 topic 下消费者较长时间离线,消息堆积量大
  • 完全的分布式系统:Broker、Producer、Consumer 都原生自动支持分布式,依赖 zookeeper 自动实现复杂均衡
  • 支持Hadoop数据并行加载:对于像 Hadoop 的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案

6. ZeroMQ

号称最快的消息队列系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常使用,偏重于实时数据通信场景。ZMQ 能够实现 RabbitMQ 不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,开发成本高。因此 ZeroMQ 具有一个独特的非中间件的模式,更像一个 socket library,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序本身就是使用 ZeroMQ API 完成逻辑服务的角色。但是 ZeroMQ 仅提供非持久性的队列,如果 down 机,数据将会丢失。如:Twitter 的 Storm 中使用 ZeroMQ 作为数据流的传输。

ZeroMQ 套接字是与传输层无关的:ZeroMQ 套接字对所有传输层协议定义了统一的 API 接口。默认支持 进程内(inproc) ,进程间(IPC) ,多播,TCP 协议,在不同的协议之间切换只要简单的改变连接字符串的前缀。可以在任何时候以最小的代价从进程间的本地通信切换到分布式下的 TCP 通信。ZeroMQ 在背后处理连接建立,断开和重连逻辑。

特性:

  • 无锁的队列模型:对于跨线程间的交互(用户端和session)之间的数据交换通道pipe,采用无锁的队列算法 CAS;在 pipe 的两端注册有异步事件,在读或者写消息到 pipe 的时,会自动触发读写事件。
  • 批量处理的算法:对于批量的消息,进行了适应性的优化,可以批量的接收和发送消息。
  • 多核下的线程绑定,无须 CPU 切换:区别于传统的多线程并发模式,信号量或者临界区,zeroMQ 充分利用多核的优势,每个核绑定运行一个工作者线程,避免多线程之间的 CPU 切换开销。