RabbitMq基礎設定

最近阿猩在專案中使用了RabbitMQ,最近終於有空釐清了RabbitMQ基礎、及一些較細節的設定,這篇就來談談RabbitMQ可以使用的場景及如何設定吧。

 

 

Message Queue


Message Queue(簡稱MQ),中文直譯為訊息佇列。看看AWS對於MQ的說明,「訊息佇列是在無伺服器和微型服務架構中使用的一種非同步服務對服務通訊形式。」過往在開發時,常會遇到一些情境,因某個環節的工作流程較重,導致整個流程被卡住,例如

  1. 執行API後,要紀錄Transaction Log
  2. 執行API後,需要發Mail、SMS簡訊、推播
  3. 爬蟲時,取得Uurl及HTML後,需做相關處理,如資料清洗、寫入資料庫等


在現代的架構中,應用程式會盡量分離成許多較小的獨立建置區塊,會較易於開發、部署和維護。MQ有個很重要的概念是Publish/Subscribe,意即推送者將訊息推送至Queue後,不需等待回應。消費者(Consumer)訂閱特定的Queue,接收到新訊息後,再進行後續的業務邏輯處理。

而較有名的MQ,如RabbitMQKafka等,都有Fault Tolerance,訊息被成功送進Queue後,若沒被成功處理,任務都會留著,直到被成功處理後才會從Queue中消失。



RabbitMQ介紹


RabbitMQ 是使用 Erlang 語言開發的開源 Message Queue 系統,基於 AMQP 協議來實現。安裝方式可透過檔案安裝、Docker、Kubernetes的方式,阿猩是使用YAML建置RabbitMQ環境(參考1),RabbitMQ操作介面預設的port為15672,登入成功後就可以看到操作介面了(圖1)。
 

圖1 RabbitMQ 操作介面

 

RabbitMQ教學


RabbitMQ 官方文件中,提供了多種程式語言的範例版本(參考2、圖2)。這裡阿猩建議有興趣的人可以按照順序往下看,在各個範例中,會逐漸帶入一些重要的設定觀念。阿猩是使用C#進行測試。
 

圖2 RabbitMQ 官網程式碼範例


 

下列整理一些常用的設定關鍵字
channel.QueueDeclare

  1. queue:指定佇列名稱
  2. durable:Rabbit重啟後,是否保留Queue的內容,若是,則寫到硬碟中。
  3. exclusive:是否可多個連接
  4. autoDelete:最後的Consumer結束連結後,是否刪除Queue

channel.BasicConsume

  1. autoAck:若設為True,訊息送給Consumer後即自動確認,若要Consumer處理成功後才手動回應,需設為False。

 

channel.basicAck

  1. RabbitMQ提供basic.ack、basic.nack、basic.reject(參考3 https://www.rabbitmq.com/confirms.html)。
  2. Multiple Deliveries at Once 通常會設定為false,除非想要一次確認Queue中,Tag以前的所有訊息。

 

BasicQos

  1. prefetchSize:設為0表示不限制訊息大小。
  2. prefetchCount:指定Consumer一次可處理的訊息量。
  3. global:是否為所有Consumer共用設定,若為False,可分別設定Consumer的訊息處理量設定。

 

RabbitMQ進階設定


除了官網介紹的設定之外,阿猩也整理了其他設定方法。

basicPublish
mandatory:預設為false,找不到符合的Queue會直接丟棄訊息,若為true:找不到匹配的Queue,會將訊息返回給Publish(圖3)。

圖3 mandatory設定

Queue Argument
在RabbitMQ中操作介面,找到可用的Argument類型,設定的參數名稱也很貼心的直接告訴你(圖4),有興趣深入研究的人可參考(參考4參考5 )。

Dictionary<String, Object> arguments = new Dictionary<String, Object>();
arguments.Add("x-message-ttl", 6000);
channel.QueueDeclare(queue: “Test”, durable: true, exclusive: false, autoDelete: false, arguments: arguments);
圖4 Argument可用參數