市面上消息队列的种类繁多,我们经常在做技术选型的时候,就会搜“RabbitMQ/RocketMQ/Kafka…的区别”这样的字眼,为了就是更好地选型,结合业务需求以及消息队列的性能、功能特性、设计规范来综合考虑,确定一款适合的组件来承接业务需求。、
消息服务规范
主要是定义了一套标准和规则,用于在分布式系统中应用程序之间进行异步、可靠和有序的消息交换。
描述的内容主要包括:
-
消息格式:规定了消息的结构、数据类型、头部信息(如优先级、时间戳、消息ID等)以及有效负载的内容格式。
-
网络通信机制:定义了客户端如何与消息中间件服务器建立连接,包括传输层协议(例如TCP/IP)、序列化方式(如二进制或文本格式)以及认证和授权方法。
-
操作模型:说明了消息生产者如何发布消息到队列或主题,消费者如何从队列或主题订阅并接收消息,以及消息路由和分发的策略。
-
事务和可靠性保证:规范了消息传递过程中的事务处理、确认机制、消息持久性、消息顺序保证以及消息重试策略等。
-
安全性和隐私保护:如果适用,会规定如何加密消息以确保数据的安全传输,以及支持访问控制和权限管理的方法。
-
错误处理和故障恢复:描述了在遇到网络问题、节点故障等情况下,消息队列系统的容错机制和恢复流程。
通过学习和了解消息服务规范,可以了解到不同的规范可能面向不同的场景,对应实现指定规范的消息队列也就可以辅助你选择。
AMQP(Advanced Message Queuing Protocol)
AMQP是一个开放标准的高级消息队列协议,旨在为面向消息中间件提供统一的平台无关接口。它允许消息在不同的应用、操作系统和网络之间可靠传输。
支持AMQP的流行消息代理有:
- RabbitMQ
- Apache Qpid
- Azure Service Bus
- Amazon MQ
- ActiveMQ Artemis(自5.7版本开始支持AMQP 1.0)
MQTT (Message Queuing Telemetry Transport)
MQTT是一种轻量级的发布/订阅消息协议,特别适合于低带宽、高延迟或不可靠网络环境下的物联网(IoT)设备间通信。更偏硬件的使用场景。
支持MQTT的流行消息代理有:
- Mosquitto
- HiveMQ
- EMQ X
- AWS IoT Core
- IBM Watson IoT Platform
STOMP (Simple Text Oriented Messaging Protocol)
STOMP是一种简单易用的文本协议,适用于多种消息中间件系统。它定义了一种客户端可以与消息代理进行交互的标准帧格式。
支持STOMP的流行消息代理有:
- RabbitMQ(通过插件支持)
- ActiveMQ
- Apache Apollo
- Spring WebSocket STOMP Support
XMPP (Extensible Messaging and Presence Protocol)
虽然最初设计用于即时通讯,但XMPP也可用于消息传递和数据共享,尤其在网络中实现实时通信和通知服务。
支持XMPP的流行消息代理有:
- Openfire
- ejabberd
- Tigase
- MongooseIM
JMS (Java Message Service)
JMS不是一种网络协议,而是一个API规范,定义了如何在Java平台上创建、发送、接收和读取消息。JMS应用程序可以与任何遵循该规范的消息中间件协同工作。 允许应用程序通过不同的消息中间件(Message Oriented Middleware, MOM)产品进行互操作,这些MOM产品包括IBM WebSphere MQ、OracleAQ、ActiveMQ等
支持JMS的流行消息代理有:
- Oracle WebLogic Server JMS
- IBM WebSphere MQ
- Apache ActiveMQ
- Red Hat JBoss A-MQ
OpenWire
OpenWire是ActiveMQ项目开发的一种高效二进制协议,专为高性能传输而设计,主要用于Apache ActiveMQ与其他客户端之间的通信。
支持OpenWire的流行消息代理有: Apache ActiveMQ(原生支持)
AMQPS(AMQP over SSL/TLS)
这是在AMQP基础上使用SSL/TLS加密的版本,以确保消息在传输过程中的安全性。
MQTT-SN(MQTT for Sensor Networks)
为传感器网络优化的MQTT协议变体,针对资源受限的设备进行了调整。
主流产品时间线
时期 | 组件 | 特性 |
---|---|---|
1983 | Teknekron | 软件总线的思想诞生 |
1985 | The Information Bus(TIB) | 发布订阅模式模式诞生,用于解决金融交易 |
1993 | IBM MQ | 用于金融服务行业 |
1997 | MSMQ | 微软消息队列诞生 |
2001 | JMS规范出现 | 不同的API、不同的协议,无法组成单一的总线 |
2003 | ActiveMQ | 市场上大多数的MOMs是商业,闭源而且购买和支持昂贵,市场继续一个开源的消息队列组件 |
2004 | AMQP规范出现 | 设计为开发标准,用于解决众多的消息队列需求和拓扑结构 |
2006 | RabbitMQ | 跟进AMQP标准,快速迭代 |
2011 | Kafka | Linkedin团队为满足自己的业务需求而开发的产品,取代ActiveMQ |
2012 | RocketMQ | Kafka在大数据等在线、离线分析链路表现出色,但在业务处理高并发的场景下堆积严重显得力不从心,阿里巴巴结合自身需求自研RocketMQ |
2018 | Pulsar | 雅虎内部为解决多部门、多租户问题,自研Pulsar |