天天看點

【參考】RabbitMQ使用總結:持久化

  • 持久化

     RabbitMQ的持久化是為了實作服務從異常狀态恢複後恢複之前的狀态。RabbitMQ發送消息涉及交換器(exchange)、隊列(queue)、消息,因而持久化包括交換器的持久化、隊列的持久化、消息文本的持久化。擷取消息是從隊列中擷取的、交換器進行的轉發,是以為了確定消息的最終持久化,一般交換器、隊列、消息都要進行持久化。 

     剛開始做練習的時候,一直有兩個疑問沒想通? 

     1、工作隊列練習中隻有一個consumer可以接收到消息,交換器類型的練習可以多個consumer接收到消息。一直在想為什麼? 

     對比其差異才發現,工作隊列練習多個consumer聲明在同一個queue上,而轉發器是把消息轉發給相比對的queue上,各自queue上聲明的consumer可以從上擷取到消息 

     2、轉發器練習先啟動消息發送類,再啟動消息接收類,無法接收消息。為什麼工作隊列的練習可以? 

     轉發器是把消息轉發給隊列,consumer從隊列上擷取消息。轉發器練習中消息發送類中不需要先聲明一個隊列,先啟動發送消息類,這時候沒有接收隊列,是以消息實際上未發出去。是以consumer隻能接收所在隊列聲明後的消息。 

     針對上述情況,消息發送時相比對的隊列未建立,消息丢失的情況,可以在發送消息時設定mandatory=true,同時聲明ReturnListener監聽器,接收未發送出去的消息,避免blackholed現象。是以為了保證消息的可靠投遞需要使用mandatory(true)、Publisher confirm(手動應答模式)、持久化三者結合的方式。補充:再加上消息的确認機制可確定消息成功釋出到broker 

     在搭建使用者消息時,可以建立臨時隊列綁定在fanout上接收廣播資訊(不接收非線上的消息),建立一個持久化私有隊列(消息上線即可見),用于接收使用者個人資訊