1. 程式人生 > >rabbitmq分散式工作佇列work queues

rabbitmq分散式工作佇列work queues

開發十年,就只剩下這套架構體系了! >>>   

任務佇列解藕

工作佇列中,任務避免立即執行對資源相關的操作,因為耗時較長,需要等待任務完成才能執行下一步動作

我們將任務封裝成一個訊息,併發送到佇列中。

後臺執行的執行者將傳送到佇列中,如果有多個執行者,任務將會分配到不同的執行者執行

這個用在web應用解決一個短http請求視窗處理複雜處理邏輯非常有用

 

Round-robin 分發

使用任務佇列能夠併發執行任務,預設地,rabbitmq將傳送每個訊息到下一個消費者,每個消費者都會平均分配訊息,這種分發訊息的方式為round-robin

message acknowledgment 訊息確認

 

完成任務需要一段時間,假設在這段時間內執行緒崩潰,目前一旦將訊息傳送給消費者,這條訊息就打上了刪除的標示,一旦停止這個執行緒就丟失了正在處理的訊息,我們也會丟失掉所有發到這個工作者的訊息,這些訊息都沒有被處理。

我們需要的是,當一個工作者在不健康的狀態,我們可以把任務重新分配給另一個工作者。

rabbitmq支援訊息的確認,消費者告訴rabbitmq特定的訊息已經收到,處理,rabbitmq可以刪除它

 

如果消費者(channel關閉,連線斷開,tcp連線斷開)沒有確認訊息,rabbitmq確認訊息沒有完全處理,將它重新放入佇列,如果有其他線上的消費者,將會把訊息處理的任務分配給其他線上的消費者,訊息確認預設是開著的,沒有確認的訊息會再次被處理

 

訊息持久化

 

我們已經學會了如何確保消費者服務失敗後,任務不會丟失,但是如果rabbitmq服務失敗後,任務也會丟失

當rabbitmq退出或者崩潰後,它將會丟失佇列和訊息

兩方面可以保證不會丟失,我們應該將佇列和訊息設定為持久的

首先將queue設定為持久的

命令本身是對的,但是我們已經使用了一個非持久的同名佇列

rabbitmq不允許重新定義引數不同的相同佇列,因此會報錯

其次我們可以設定訊息也是持久的 MessageProperties.PERSISTENT_TEXT_PLAIN