最全RabbitMQ教程4 常見問題

2021-10-19 13:59:13 字數 2746 閱讀 1016

二、如何保證訊息冪等?

三、如何保證訊息的順序?

這是面試時最喜歡問的問題,其實這個是所有mq的乙個共性的問題,大致的解決思路也是差不多的,但是針對不同的mq產品會有不同的解決方案。之前針對rocketmq做過分析,我們再按照rabbitmq來分析下這個問題。

我們考慮乙個通用的mq場景:

其中,1,2,4三個場景都是跨網路的,而跨網路就肯定會有丟訊息的可能。

然後關於3這個環節,通常mq存檔時都會先寫入作業系統的快取page cache中,然後再由作業系統非同步的將訊息寫入硬碟。這個中間有個時間差,就可能會造成訊息丟失。如果服務掛了,快取中還沒有來得及寫入硬碟的訊息就會丟失。

這個是mq場景都會面對的通用的丟訊息問題。那我們看看用rocket時要如何解決這個問題。

​ 有兩種方式,一種是生產者的事務機制。另一種是使用生產者確認機制。

​ 生產者的事務機制主要是幾個關鍵的方法: channel.txselect() 開啟事務; channel.txcommit() 提交事務; channel.txrollback() 回滾事務; 用這幾個方法來進行事務管理。但是這種方式會對channel產生阻塞,吞吐量會下降

​ 另一種更好的方式是使用生產者確認機制。這種機制基本跟rocketmq的事務訊息機制是非常像的,具體回顧下前面的課程內容。

​ 這個在rabbitmq中比較好處理,把佇列宣告成為持久化佇列即可。另外,新增的quorum型別的佇列也能更好的保證訊息不會丟失。

​ 這涉及到rabbitmq的集群架構。首先他的普通集群模式,訊息是分散儲存的,不會主動進行訊息同步了,是有可能丟失訊息的。而映象模式集群,資料會主動在集群各個節點當中同步,這時丟失訊息的概率不會太高。更進一步,新增的quorum型別的對了,採用raft協議來進行訊息主從同步。

​ rabbitmq在消費訊息時可以指定是自動應答,還是手動應答。如果是自動應答模式,消費者會在完成業務處理後自動進行應答,而如果消費者的業務邏輯丟擲異常,rabbitmq會將訊息進行重試,這樣是不會丟失訊息的,但是有可能會造成訊息一直重複消費。

​ 將rabbitmq的應答模式設定為手動應答可以提高訊息消費的可靠性。

channel.

basicconsume

(queuename,

false

,new

defaultconsumer

(channel)})

;channel.

basicconsume

(queuename,

true

, myconsumer)

;

​ 另外這個應答模式在springboot整合案例中,也可以在配置檔案中通過屬性spring.rabbitmq.listener.******.acknowledge-mode 進行指定。可以設定為 auto 自動應答; manual 手動應答;none 不應答; 其中這個none不應答,就是不啟動應答機制,rabbitmq只管往消費者推送訊息後,就不再重複推送訊息了,相當於rocketmq的sendoneway, 這樣效率更高,但是顯然會有丟訊息的可能。

1、rabbitmq的自動重試功能:

​ 當消費者消費訊息處理業務邏輯時,如果丟擲異常,或者不向rabbitmq返回響應,預設情況下,rabbitmq會無限次數的重複進行訊息消費。

​ 處理冪等問題,首先要設定rabbitmq的重試次數。在springboot整合rabbitmq時,可以在配置檔案中指定spring.rabbitmq.listener.******.retry開頭的一系列屬性,來制定重試策略。

然後,需要在業務上處理冪等問題。在rabbitmq中,可以給每個訊息指定乙個全域性唯一的messageid,在消費者端針對messageid做冪等性判斷。關鍵**:

//傳送者指定id欄位

message message2 = messagebuilder.

withbody

(message.

getbytes()

).setmessageid

(uuid.

randomuuid()

.tostring()

).build()

; rabbittemplate.

send

(message2)

;//消費者獲取messageid,自己做冪等性判斷

@rabbitlistener

(queues =

"fanout_email_queue"

)public

void

process

(message message)

throws exception

​ 當然,實際工作中,這個判斷冪等的字段最好改為有業務意義的字段,這樣能更好的防止重複消費問題對業務資料的影響。

​ 關於訊息順序的問題,詳細的分析可以參考rocketmq的順序訊息模式,針對訊息的全域性有序和區域性有序有更詳細的設計。

​ 而在rabbitmq當中,並沒有提供順序訊息的功能。最好的方式是模擬rocketmq的順序訊息機制來制定訊息消費方式。

​ 在傳送者端,保證將一組有順序的訊息依次傳送到同乙個佇列,然後消費者消費這個佇列時,保證只有單一消費者例項來消費這個佇列上的訊息。這一般只能通過單生產者例項+單佇列+單消費者例項 來解決,但是這樣,會嚴重影響mq的效能及吞吐量,所以需要慎重。

最全solr教程

解壓後目錄結構 命令 solr start 2.進入到solr的bin目錄下cmd 輸入命令solr start啟動solr 3.進入首頁 首先去 solr 7.7.2 server solr 建立乙個名字為new core的資料夾 然後拷貝當前目錄下 solr 7.7.2 server confi...

RabbitMQ官網教程4 路由

前面的章節我們建立了乙個簡單的日誌系統,可以把訊息廣播到許多接收者。本節我們將增加乙個特性 只訂閱一部分訊息。比如只把錯誤日誌輸出到檔案,同時把所有日誌輸出到螢幕。繫結 前面的例子裡我們已經建立過繫結。繫結就是交換機和佇列間的一種關係,簡單解讀為佇列關注該交換機的訊息。建立繫結時可以增加乙個引數ro...

RabbitMQ 安裝教程

rabbitmq簡介 rabbitmq是實現了高階訊息對列協議 amqp 的開源訊息 軟體,它是用高效能 可伸縮而聞名的erlang語言編寫而成的,其集群和故障轉移是構建在開放電信平台框架上的。第一步 先安裝rabbitmq依賴語言開發包erlang,erlang 執行。安裝成功後配置環境變數,預設...