RabbitMQ 学习系列3 入门下(AMQP协议介绍)
2.2 AMQP协议介绍
RabbitMQ就是AMQP协议的Erlang的实现,当然RabbitMQ还支持STOMP、MQTT等消息协议。
AMQP: (Advanced Message Queuing Protocol)高级消息对列协议
STOMP:(Simple (Or Streaming)Test Oriented Messaging Protocl)简单(流)文本面向消息协议。
MQTT:(Message queuing Telemetry Transport)消息队列遥测转输。
AMQP协议本身包括三层:
Module layer:位于协议最高层,主要定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑,例如 客户端可以使用Queue.Declare命令声明一个队列。
Session Layer: 位于中间层,主要负责将客户端的命令发送给服务器,再将服务端的应答返回给客户端,主要为客户端与服务端之间的通信提供可靠性同步机制和错误处理。
Transport Layer: 位于最低层,主要传输二进制数据流,提供帧的处理,信道复用,错误检测和数据表示等。
AMQP说到底还是一个通信协议,通信协议都会涉及报文交互,从low-level举例来说,AMQP本身是应用层的协议,其填充于TCP协议层的数据部分。从high-level来说,AMQP是通过协议命令进行交互的。AMQP协议可能看作一系列结构化命令的集合,这里的命令代表一种操作,类似于HTTP中的方法(GET、post、put等)
2.2.1 AMQP生产者流转过程
为了形象地说明AMQP协议命令的流转过程,如下代码所示:
当客户端与Broker建立连接的时候,会调用factory.newConnection方法,这个方法会进一步封装成Protocol Header 0-9-1的报文头发送给Broker,以此通知Broker本次交互采用的是AMQP 0-9-1协议,紧接着Broker返回 Connection.Start 来建立连接,在连接的过程中涉及
Connection.Start,
Connection.Start-OK,
Connection.Tune,
Connection.Tune-OK,
Connection.Open,
Connection-Open-OK 这6个命令的交互。
当客户端调用connection.CreateChannel 方法准备开启信道的时候,其包装Channel.Open命令发送给Broker,等待Channel.Open-OK命令。
当客户端发送消息的时候,需要调用channel.basicPublish方法,对应的AMQP命令为Basic.Publish,注意这个命令和前面涉及的命令略有不同,这个命令还包含了Content Header和Content Body。Content Header里面包含的是消息体的属性,例如投递模式,优先级,而Content Body包含消息体本身。
当客户端发送完消息需要关闭资源时,涉及Channel.Close,Channel-Close-OK,与Connection.Close,Connection-Close-OK的命令交互,详细流转过程如下:
2.2.2 AMQP消费者流转过程
下面是截取消费端的关键代码如下所示:
消费者客户端同样需要与Broker建立连接,与生产者客户端一样,协议交互同样涉及Connection的6个交互命令。
紧接着也少不了创建Channel,和生产者客户端命令一样。
如果在消费之前调用了channel.BasicQos(int prefetchCount)的方法来设置消费者客户端最大能“保持”的未确认的消息数,那么协议流转会涉及Basic.Qos,Basic.Qos-OK这两个AMQP命令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2018-05-14 sql server 性能调优之 死锁排查