RabbitMQ入門-AMQP協議

   RabbitMQ和AMQP
   AMQP生產者流轉過程
   AMQP消費者流轉過程


   RabbitMQ和AMQP

     RabbitMQ遵從AMQP協議,AMQP的模型架構和RabbitMQ的模型架構是一樣的,生產者將消息發送給交換器,交換器和隊列綁定。當生產者發送消息時所攜帶的RoutingKey與綁定時的BindingKey相匹配時,消息即被存入相應的隊列之中。消費者可以訂閱相應的隊列來獲取消息。
     RabbitMQ中的交換器、交換器類型、隊列、綁定、路由鍵等都是遵循AMQP協議中相應的概念。
     AMQP協議本身包括三層:

  1. Module Layer:位於協議最高層,主要定義了一些供客戶端調用的命令,客戶端可以利用這些命令實現自己的業務邏輯。如客戶端可以使用Queue.Declare命令聲明一個隊列或者使用Basic.Consume訂閱消費一個隊列中的消息。
  2. Session Layer:位於中間層,主要負責將客戶端的命令發送給服務器,再將服務器的相應返回給客戶端,主要爲客戶端與服務器之間的通信提供可靠性同步機制和錯誤處理。
  3. Transport Layer:位於最底層,主要傳輸二進制數據流,提供幀的處理、信道複用、錯誤監測和數據表示等。

     AMQP說到底還是一個通信協議,通信協議都會涉及報文交互,從low-level舉例說,AMQP本身是應用層協議,其填充於TCP協議層的數據部分。從high-level來說,AMQP是通過協議命令來進行交互的。AMQP協議可以看作一系列結構化命令的集合。


   AMQP生產者流轉過程

     生產者連接代碼:

Connection connection = factory.newConnection();	//創建連接
Channel channel = connection.createChannel();	//創建信道
String message = "Hello World!";
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
channel.close();
connection.close();

     流轉過程圖:
                                   在這裏插入圖片描述
     步驟分析:

  1. 客戶端與Broker建立連接,調用factory.newConnection方法,這個方法會進一步封裝成Protocol Header 0-9-1(如果支持的協議是AMQP 0-9-1)的報文頭髮送給Broker,以此通知Broker本次交互採用的是AMQP 0-9-1協議,接着Broker返回Connection.Start來建立連接,在連接過程中涉及Connection.Start/.Start-OK、Connection.Tune/.Tune-OK、Connection.Open/.Open-OK等6個命令交互。
  2. 當客戶端調用connection.createChannel方法準備開啓信道的時候,其包裝Channel.Open命令發送給Broker,等待Channel.Open-OK命令。
  3. 當客戶端發送消息時,需要調用channel.basicPublish方法,對應的AMQP命令爲Basic.Publish,這個命令其中還包含了ContentHeader和Content Body。Content Header裏面包含的是消息體的屬性,如投遞模式、優先級等。而Content Body包含消息體本身。
  4. 當客戶端發送完消息需要關閉資源時,涉及Channel.Close/.Close-OK與Connection.Close/.Close-Ok命令交互。

   AMQP消費者流轉過程

     消費者連接代碼:

Connection connection = factory.newConnection(address);	//創建連接
final Channel channel = connection.createChannel();	//創建信道
Consumer consumer = new DefaultConsumer(channel);	
channel.basicQos(64);
channel.basicConsume(QUEUE_NAME, consumer);
TimeUnit.SECONDS.sleep(5);
channel.close();
connection.close();

     流轉過程圖:
                                   在這裏插入圖片描述
     步驟分析:

  1. 消費者客戶端與Broker建立連接,協議交互同樣涉及Connection.Start/.Start-OK、Connection.Tune/.Tune-OK、Connection.Open/.Open-OK等。
  2. 與生產者一樣在Connection上建立信道Channel。
  3. 調用channel.basicQos(int perfetchCount)的方法設置消費者客戶端最大能"保持"的未確認的消息數,協議涉及Basic.Qos/.Qos-OK這兩個AMQP命令。
  4. 在真正消費之前,消費者客戶端向Broker發送Basic.Consume命令(channel.basicConsume方法)將Channel設置爲接受模式,之後Broker回執Basic.Consume-OK以告訴消費者客戶端準備好消費消息。接着Broker向消費者推送消息,即Basic.deliver命令,該命令同樣攜帶了Content Header和Content Body。
  5. 消費者接收到消息並正確消費之後,向Broker發送確認,即Basic.Ack命令
  6. 在消費者停止消費的時候,主動關閉連接,涉及Channel.Close/.Close-OK與Connection.Close/.Close-Ok命令交互。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章