概述
AMQP(Advanced Message Queuing Protocol,高级消息队列协议),是一个进程间传递异步消息的网络协议,是应用层协议的一个开放标准。基于此协议的客户端与消息中间件可传递消息,不受客户端/中间件的不同产品、不同开发语言等条件的限制。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP在消息提供者和客户端的行为进行了强制规定,使得不同企业和厂商的产品之间真正实现了互操作能力。
- 组织 – 不同组织中的应用程序
- 技术 – 不同平台上的应用程序
- 时间 – 系统不需要同时可用
- 空间 – 在远距离或网络较差的网络上可靠运行
发展历史
消息队列(Message Queue)起源于一位来自 MIT 的硬件设计教育工作者 Vivek Ranadivé 设想了一种通用软件总线,就像主板上的总线那样,供其他应用程序接入。Vivek在1983年成立了 Teknekron,高盛等公司作为第一批用户再金融交易中采用了 Teknekron的软件,同时还诞生了第一代消息队列软件:Teknekron 的 The Information Bus(TIB)。
Teknekron 的 TIB 允许应用开发者建立一系列规则去描述消息内容,只要消息按照这些规则发布出去,任何消费者应用都可以订阅感兴趣的内容,信息的生产者和消费者完全解耦,并且可以再传输过程中灵活混合。这个特性引起了电信特别是新闻机构的注意。1994年路透社收购了 Teknekron 。
由于消息队列再金融交易中应用的反响,BIM 在1990年也开始研发自己的消息队列软件(BIM MQ),并且逐步演化成 WebSphere MQ 并统治着商业消息队列平台市场。同时微软开发了Microsoft Message Queue(MSMQ)。然而各个厂商的 MQ 之间无法互通。为了解决这个问题,Java Message Service(JMS)在2001年诞生了,试图通过提供公共 Java API的方式隐藏MQ各个供应商提供的实际接口,从而跨越壁垒和解决互通问题,但是由于使用单独的标准化接口来胶合众多不同的接口使应用程序反而变得更加脆弱。
2004年 JPMorgan Chase 和 iMatix 公司一起合作开发 Advanced Message Queuing Protocol (AMQP,高级消息队列协议),从一开始就设计成为开放标准,任何人都可以执行这一标准,针对该标准任何人都可以和任何 AMQP 供应商提供的 MQ 服务器进行交互。2007 年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布.
AMQP协议
Message Queue:消息队列
队列充当缓冲区,用于存储以后使用的消息。在创建过程中,还可以使用许多属性声明队列。例如,它可以标记为持久、自动删除和独占,其中独占意味着它只能由一个连接使用,并且当该连接关闭时,此队列将被删除。
Exchanges and Exchange Types:交换及交换类型
通道根据交换类型以及交换与队列之间的绑定将消息路由到队列。要使队列接收消息,它必须绑定到至少一个交换,AMQP 0.9.1 代理应提供四种交换类型 – 直接交换、扇出交换、主题交换和标头交换,在创建过程中,可以使用许多属性声明交换。例如,它可以被标记为持久,以便在代理重新启动后继续存在,也可以标记为自动删除,这意味着当最后一个队列未绑定时,它会自动删除。
Binding:绑定
绑定是队列和交换之间的关系,由交换使用的一组规则(以及其他规则)用于将消息路由到队列
Message and Content:消息及内容
消息是从发布者发送到队列并最终由使用者订阅的实体。每条消息都包含一组标头,用于定义属性,如生命周期、持久性和优先级。AMQP 0.9.1 还具有一个称为消息确认的内置功能,用于确认消息传递和/或处理。
Connection:连接
AMQP 0.9.1 中的连接是应用程序和 AMQP 代理之间的网络连接,例如 TCP/IP 套接字连接。
Channel:通道
是连接内的虚拟连接,位于两个 AMQP 对等体之间。消息发布到队列或从队列使用消息是通过通道 (AMQP) 执行的。一个通道是多路复用的,一个连接可以有多个通道。
Virtual Hosts:虚拟主机
虚拟主机 (vhost) 提供了一种在代理中隔离应用程序的方法。不同的用户可以对不同的虚拟主机具有不同的访问权限。创建队列和交换时,它们仅存在于一个虚拟主机中
AMQP Methods:方法
AMQP 0.9.1提供了许多可以执行的方法或操作。AMQP 方法的一些示例包括打开通道、声明队列或删除交换(通道打开、队列声明或交换删除-ok)
AMQP vs MQTT
虽然AMQP和MQTT在架构和协议上有很多不同之处,但它们正被广泛用于物联网等各种应用中。作为开源协议,AMQP和MQTT都可以根据客户端要求和可用带宽在所有应用程序中使用
项目 | AMQP | MQTT |
定义 | AMQP 扩展为高级消息队列协议。AMQP 提供了更丰富的消息传递环境。 | MQTT 被定义为消息队列遥测传输。它提供了一种简单的消息排队服务方式,并且主要在嵌入式系统中实现 |
背景 | AMQP由金融集团开发为开源和客户驱动的队列。它在市场上每天都在改进,没有任何定制 | MQTT 主要由供应商驱动,由 IBM 开发,实施成本高。 |
协议 | AMQP 使用 TCP 进行消息异步传输,而不管操作系统、硬件或编程语言的任何选择。它提供了具有完全生命力的消息传递服务。AMQP在网络用户和基础设施资源的各种控制下在各方内运行。 | 与 AMQP 类似,MQTT 使用 TCP 在独立于任何属性的异步方法中共享消息。它专为在网络最小带宽上运行的小型设备而设计。MQTT认为错综复杂的各方由附近的私有基础设施管理。 |
架构优化 | 它在数据成帧线上进行了高级优化,具有可提高服务器性能的缓冲方法。 | 该框架使用类似流的方法为最小存储设备执行帧。它不允许传输批量邮件。 |
消息服务 | AMQP 应用于五种不同的属性,例如发布者-订阅者不受影响的生存期,只要它需要它保持在队列中,如果没有人在使用队列,则保持静止。它支持各种消息传递轮循机制、经典或传统消息队列、组合以及保存和转发。它执行元数据消息以帮助幂等消息和消息分组。 | 基于对内容的发布和订阅消息传递,并且是高度瞬态的。它主要用于主动路由链接的订阅者和发布者。它仅限于应用于传统的延长寿命消息队列。 |
消息处理 | 它支持不同的确认,事务,用例以及整个消息队列。它能够分解各种事务代码,这是必需的,并在存在延迟以微调性能时确认为已过期。 | MQTT 不支持任何类型的消息处理,只支持确认 |
连接安全性 | AMQP 利用 SASL 方法来选择安全性,而无需更改任何协议。它为同一网络中的组件提供不同的名称。因此,此功能使我们能够使用嵌套防火墙和网守。它将在广播任何消息之前向用户进行身份验证 | MQTT 需要小用户名和密码,并且在此趋势期间不设置任何预防措施。 |
最后值队列 | 它不支持队列中的最后一个值 | 它提供 Retain 命令并支持队列中的最后一个值。 |
消息中的命名空间 | 它允许多种方式查找消息,例如节点和队列 | 它在消息的分层传输中使用“命名空间”。 |
内容审核: