主流开源消息队列对比与分析
Posted key_3_feng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主流开源消息队列对比与分析相关的知识,希望对你有一定的参考价值。
目前市面上存在ZeroMQ、ActiveMQ、RocketMQ、Kafka等消息中间件来这些消息中间件进行简要的说明对比与分析。
1、ZeroMQ
ZeroMQ 是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ 是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),它是一个可伸缩层,可并行运行,分散在分布式系统间。
ZeroMQ几乎所有的I/O操作都是异步的,主线程是不会被阻塞的。ZeroMQ会根据用户调用zmq_init函数时传入的接口参数来创建对应数量的I/O线程。每个I/O线程都有与之绑定的Poller,Poller采用经典的Reactor模式实现,Poller根据不同的操作系统平台使用不同的网络I/O模型(如select、poll、epoll、devpoll、kequeue等)。
主线程和I/O线程通过Mail Box传递消息来进行通信。当服务器开始监听或者客户发起连接时,在主线程中创建 zmq_connecter或zmq_listener,通过Mail Box发消息的形式将其绑定到I/O线程,I/O线程会把zmq_connecter或zmq_listener添加到Poller中用以侦听读/写事件。当服务器与客户端第一次通信时,会创建zmq_init来发送标识,用以进行认证。
当认证结束后,双方会为此次连接创建Session,以后双方就通过Session进行通信。每个Session都会关联到相应的读/写管道,主线程收发消息是分别从管道中读/写数据的。Session并不是实际地跟Kernel交换I/O数据,而是通过Plugin到Session中的Engine来与Kernel交换I/O数据的。ZeroMQ开发者引入JAR包直接使用,不支持数据持久化,所以它适合在高吞吐量或低延迟的场景中使用,但是需要大量编码。
2、ActiveMQ
ActiveMQ是一种开源的消息队列,实现了JMS 1.1规范的面向消息的中间件(MOM),为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。ActiveMQ的设计目的是提供标准的、面向消息的、能够跨越多语言和多系统的应用集成消息通信中间件。
ActiveMQ实现了JMS标准并提供了很多附加特性,包括JMX管理、主从管理(Master/Slave,这是集群模式的一种,主要体现在可靠性方面,当主代理出现故障时,从代理会替代主代理的位置,不至于使消息系统瘫痪)、消息组通信(同一组消息,仅会提交给一个客户进行处理)、有序消息管理(确保消息能够按照发送的次序被接收者接收)、消息优先级(优先级高的消息先被投递和处理)、订阅消息的延迟接收(订阅消息在发布时,如果订阅者没有开启连接,那么当订阅者开启连接时,消息中介将会向其提交之前的未处理的消息)、接收者处理过慢(可以使用动态负载平衡,将多数消息提交给处理快的接收者,这主要是针对 PTP 消息所说的)、虚拟接收者(降低与中介的连接数量)、成熟的消息持久化技术(部分消息需要持久化到数据库或文件系统中,当中介崩溃时,信息不会丢失)、支持游标操作(可以处理大消息)、支持消息的转换、通过使用Apache的Camel支持EIP、使用镜像队列的形式轻松地对消息队列进行监控等。
3、RocketMQ
RocketMQ是一种纯Java的、分布式的、队列模型的开源消息中间件,其前身是MetaQ,当 MetaQ 3.0发布时,产品名称改为 RocketMQ。RocketMQ能够保证严格的消息顺序,提供丰富的消息拉取模式、高效的订阅者水平扩展能力、实时的消息订阅机制、亿级消息堆积能力。其具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。目前RocketMQ 在阿里巴巴集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景,支撑了阿里巴巴的多次“双11”活动。
4、Kafka
Kafka是LinkedIn于2010年12月开发并开源的一个分布式流平台,现在是Apache的顶级项目,是一个高性能、跨语言、分布式、发布—订阅消息队列的系统,消费者通过拉取的方式消费消息。Kafka消息中间件的特点是:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐量,在一台普通的服务器上即可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer 都原生自动支持分布式,自动实现复杂均衡。因为 Kafka 在设计之初是作为日志流平台和运营消息管道平台的,所以实现了消息顺序和海量堆积能力。
以上是关于主流开源消息队列对比与分析的主要内容,如果未能解决你的问题,请参考以下文章
消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局