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