rabbitmq-c 源码初解(一)

由于项目需要,不得不在stm32板子上实现RabbitMQ客户端以连接云服务器。查看网上资料,鲜有移植AMQP到stm32上的,rabbitmq -c客户端也只有支持windows和Linux系统的源码。所以只能照着源码自己折腾一个简单的客户端。

本章主要梳理一下一些需要了解的概念。

一、AMQP与RabbitMQ

AMQP,即 Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议, 是应用层协议的一个开放标准, 为面向消息的中间件设计。

AMQP 本身是作为应用层的协议,就像常用的HTTP协议一样,其填充于TCP 协议层的数据部分,主要是通过协议命令来进行交互(如connection.start、connncetion.start-ok、channnel.open、channnel.open-ok等 ),所以它是一个二进制协议。

而RabbitMQ是遵从AMQP协议的,换句话说,RabbitMQ就是AMQP协议的Erlang的实现,(当然RabbitMQ还能支持MQTT、HTTP等多个协议)。

二、高级消息队列模型(AMQ模型)

AMQ 模型定义了一系列模块化组件和标准规则来进行协作。有三种类型的组件可以连接服务器处理链来创建预期的功能:

1. "交换器(exchange)" :接收来自发布者应用程序的消息,并基于任意条件(通常是消息属性和内容)将这些消息路由到消息队列(message queues)。

2."消息队列(message queue)":存储消息直到它们可以被消费客户端应用程序(或多线程应用程序)安全处理。

3."绑定(binding)":定义了消息队列与交换器之间的关系,并提供了消息路由条件。

整体模型如下图:

rabbitmq-c 源码初解(一)

三、AMQP生产者流转过程

当客户端与Broker 建立连接的时候,会调用factory .newConnection 方法,这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker ,以此通知Broker ,紧接着Broker 返回Connection.Start 来建立连接,在连接的过程中涉及Connection.Start/.Start-OK 、Connection.Tune/.Tune-Ok , Connection.Open/ .Open-Ok 这6 个命令的交互。

当客户端调用connection .createChannel 方法准备开启信道的时候,其包装Channel . Open 命令发送给Broker ,等待Channel.Open-Ok 命令。

当客户端发送消息的时候,需要调用channel . basicPublish 方法,对应的AQMP 命令为Basic.Publish ,注意这个命令和前面涉及的命令略有不同,这个命令还包含了ContentHeader 和Content Body。 Content Header 里面包含的是消息体的属性,例如,投递模式、优先级等,而Content Body 包含消息体本身。

当客户端发送完消息需要关闭资源时,涉及Channel.Close/.Close-Ok 与Connection.Close/.Close-Ok 的命令交互。详细流转过程如图所示。

                                                              rabbitmq-c 源码初解(一)

以上就是对AMQP协议的初步了解,接下来会通过wireshark抓包及rabbitmq-c源码分析,来进行深度的学习。