消息队列¶
消息队列(Message Queue),简称MQ,指保存消息的一个容器,本质上是个队列。用于上下游解耦、非即时消息异步处理、流量削峰、日志处理等场景
常见的与消息队列相关的协议或标准有
JMS
Java MessageService,实际上是个Java APIAMQP
Advanced Message Queuing Protocol,最初用于解决金融领域跨平台消息传递问题,生产者与消费者可以使用不同语言开发- 其它:
MQTT
、STOMP
、OpenMessaging
目前为止还没有谁能统一标准,基于以上标准和协议开发的消息队列有
ActiveMQ
最老牌的开源消息队列,是十年前唯一可供选择的开源消息队列,目前已进入老年期,社区也不再活跃。无论是功能还是性能方面,ActiveMQ 都与现代的消息队列存在明显的差距,它存在的意义仅限于兼容那些还在用的爷爷辈儿的系统。RabbitMQ
使用最广泛的轻量级MQ,开箱即用,支持多语言客户端,支持AMQP/SMTP/STOMP等多种协议,由小众语言Erlang编写,二次开发较难,性能也比其它MQ要差很多。RocketMQ
由阿里12年使用Java开发,17年捐赠给Apache软件基金会,性能比RabbitMQ高一个数量级,中文社区活跃,但在国外可能不怎么流行,兼容性较差,主要场景是处理在线业务。Kafka
由Linkedin使用Scala和Java开发,后开源给Apache软件基金会,最初用于处理海量日志,目前是生态兼容最好的MQ,尤其在大数据和流计算领域,缺点是同步收发消息的响应时延比较高,不太适合在线业务场景。ZeroMQ
严格来说只是一个基于消息队列的多线程网络库,如果你的需求是将消息队列的功能集成到你的系统进程中,可以考虑使用ZeroMQ。Pulsar
新兴的开源MQ,最初由Yahoo开发,现在也属于Apache软件基金会,采用存储和计算分离的设计,目前还处于成长期Redis
也支持MQ功能
ZeroMQ¶
是一种基于消息队列的多线程网络库,介于应用层和传输层之间,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。
ZMQ提供了完全不同于传统BSD Socket的网络通信接口,屏蔽了Socket的处理细节,并提供了几种通信模型,基本覆盖了分布式系统的需求。
由于ZMQ隐藏了Socket细节,所以无法感知断线,于是ZeroRPC采用心跳包的方式进行在线检测。Client端在断线后会抛出LostRemote异常。默认断线超时为30s,可设定。
最后更新:
2023-10-26