天天看點

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源碼分析,來進行深度的學習。

繼續閱讀