写点什么

主流开源消息队列对比与分析

  • 2022 年 9 月 18 日
    北京
  • 本文字数:1654 字

    阅读完需:约 5 分钟

主流开源消息队列对比与分析

目前市面上存在 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 在设计之初是作为日志流平台和运营消息管道平台的,所以实现了消息顺序和海量堆积能力


发布于: 刚刚阅读数: 7
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
主流开源消息队列对比与分析_消息中间件_穿过生命散发芬芳_InfoQ写作社区