常用消息队列对比
你好,我是看山。
作为中间件,消息队列是分布式应用间交换信息的重要组件。消息队列可驻留在内存或磁盘上,队列可以存储消息直到它们被应用程序读走。通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息。所以消息队列可以解决应用解耦、异步消息、流量削锋等问题,是实现高性能、高可用、可伸缩和最终一致性架构中不可以或缺的一环。下面对消息队列就直接使用 MQ 表示。
现在比较常见的 MQ 产品主要是 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ,当然还有很多其他的产品。因为个人水平有限,就简单的比较下这几种 MQ 的优缺点,作为自己选型的参考。
1 ZeroMQ
ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It's fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ZeroMQ is from iMatix and is LGPLv3 open source.
ZeroMQ 号称是“史上最快的消息队列”,基于 c 语言开发的,可以在任何平台通过任何代码连接,通过 inproc、IPC、TCP、TIPC、多播传送消息,支持发布-订阅、推-拉、共享队列等模式,高速异步 I/O 引擎。
根据官方的说法,ZeroMQ 是一个简单好用的传输层,像框架一样的可嵌入的 socket 类库,使 Socket 编程更加简单、简洁、性能更高,是专门为高吞吐量/低延迟的场景开发的。ZeroMQ 与其他 MQ 有着本质的区别,它根本不是消息队列服务器,更类似与一个底层网络通讯库,对原有 Socket API 进行封装,在使用的使用引入对应的 jar 包即可,可谓是相当灵活。
同时,因为它的简单灵活,如果我们想作为消息队列使用的话,需要开发大量代码。而且,ZeroMQ 不支持消息持久化,其定位并不是安全可靠的消息传输,所以还需要自己编码保证可靠性。简而言之一句话,ZeroMQ 很强大,但是想用好需要自己实现。
2 RabbitMQ
官方定义:
Robust messaging for applications
Easy to use
Runs on all major operating systems
Supports a huge number of developer platforms
Open source and commercially supported
RabbitMQ 是基于 Erlang 语言编写的开源消息队列,通过 Erlang 的 Actor 模型实现了数据的稳定可靠传输。本身是实现 AMQP 的消息队列,因此官方推荐,如果仅仅是使用 RabbitMQ 的话,建议使用 AMQP 0-9-1 的协议。不过,因为其可扩展性,可以通过插件的形式使用 STOMP、XMPP、AMQP 1.0,还可以通过插件使用 HTTP 这种非消息的传输协议。所以,RabbitMQ 可以说是适应性非常强的一个消息队列中间件了。
当然,不仅是协议支持的多,还因为它实现了代理 (Broker) 架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得 RabbitMQ 易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大,如需配置 RabbitMQ 则需要在目标机器上安装 Erlang 环境。
总的来说,RabbitMQ 在数据一致性、稳定性和可靠性方面比较优秀,而且直接或间接的支持多种协议,对多种语言支持良好。但是其性能和吞吐量差强人意,由于 Erlang 语言本身的限制,二次开发成本较高。
3 ActiveMQ
Apache ActiveMQ ™ is the most popular and powerful open source messaging and Integration Patterns server.Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, comes with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4. Apache ActiveMQ is released under the Apache 2.0 License.
ActiveMQ 介于 ZeroMQ 和 RabbitMQ 之间。类似于 ZeroMQ,它可以部署于代理模式和 P2P 模式。类似于 RabbitMQ,它易于实现高级场景,而且只需付出低消耗。被誉为消息中间件的“瑞士军刀”。
支持 OpenWire、Stomp、AMQP v1.0、MQTT v3.1、REST、Ajax、Webservice 等多种协议;完全支持 JMS1.1 和 J2EE 1.4 规范(事务、持久化、XA 消息);支持持久化到数据库。但是 ActiveMQ 不够轻巧,而且对于队列较多的情况支持不好,据说还有丢消息的情况。
目前已经有了其下一代消息产品 Apollo。
4 Apollo
ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.
Apache 称 Apollo 为最快、最强健的 STOMP 服务器。支持 STOMP、AMQP、MQTT、OpenWire 协议,支持 Topic、Queue、持久订阅等消费形式,支持对消息的多种处理,支持安全性处理,支持 REST 管理 API。功能列表很长,最大的弊病就是目前市场接收度不够,所以使用的并不广泛。
5 Kafka
Kafka™ is used for building real-time data pipelines and streaming apps. It is horizontally scalable, fault-tolerant, wicked fast, and runs in production in thousands of companies.
Kafka 是 LinkedIn 于 2010 年 12 月开发并开源的一个分布式流平台,现在是 Apache 的顶级项目,是一个高性能跨语言分布式 Publish/Subscribe 消息队列系统,以 Pull 的形式消费消息。具有以下特性:快速持久化,可以在 O(1) 的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到 10W/s 的吞吐速率;完全的分布式系统,Broker、Producer、Consumer 都原生自动支持分布式,自动实现复杂均衡。因为设计之初是作为日志流平台和运营消息管道平台,所以实现了消息顺序和海量堆积。
Kafka 自身服务与消息的生产和消费都依赖与 Zookeeper,使用 Scala 语言开发。因为其消息的消费使用客户端 Pull 方式,消息可以被多个客户端消费,理论上消息会重复,但是不会丢失(除非消息过期)。因此比较常用的场景是作为日志传输的消息平台。
6 RocketMQ
Apache RocketMQ™ is an open source distributed messaging and streaming data platform.
RocketMQ 是阿里开源的消息中间件,目前在 Apache 孵化,使用纯 Java 开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ 思路起源于 Kafka,但并不是简单的复制,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog 分发等场景,支撑了阿里多次双十一活动。
因为是阿里内部从实践到产品的产物,因此里面很多接口、api 并不是很普遍适用。其可靠性毋庸置疑,而且与 Kafka 一脉相承(甚至更优),性能强劲,支持海量堆积。不过据说,没有在 mq 核心上实现 JMS,但是也无伤大雅。
7 写在最后
其实对于这些消息队列的产品,每一种都在某一领域占有一席,虽然 ActiveMQ 目前在社区已经不是很活跃,但是其下一代产品 Apollo 已经问世。ZeroMQ 小而美,RabbitMQ 大而稳,Kakfa 和 RocketMQ 快而强劲。RocketMQ 虽然目前还很多不完善,但是一旦在 Apache 孵化成为顶级项目,全球程序猿开始贡献,前途也是不可限量的。
你好,我是看山,10 年老猿,开源贡献者。游于码界,戏享人生。关注公众号:看山的小屋,领取学习资料。
你好,我是看山,10 年老猿,开源贡献者。游于码界,戏享人生。关注公众号:看山的小屋,领取学习资料。料。
版权声明: 本文为 InfoQ 作者【看山】的原创文章。
原文链接:【http://xie.infoq.cn/article/e9a513931ecb1905ccde9fa8d】。文章转载请联系作者。
评论 (1 条评论)