訊息佇列常見問題

2021-09-25 17:46:46 字數 2397 閱讀 6571

2、系統解耦

3、流量削峰

提到mq那麼我們必然會討論mq順序性問題,比如生產者傳送訊息1,2,3...對於消費者必須按照1,2,3...這樣的順序來消費,那麼訊息佇列應該怎麼樣去考慮這樣事情呢,有人說了訊息佇列是先進先出不就保證了順序性,其實並非如此,而且想通過佇列來保證順序性是非常困難的,那麼我們來看看為什麼說非常困難的。

對於生產者而言

比如生產者連續傳送1、2、3但是不久2和3返回結果成功,唯獨1返回結果是失敗,這個時候如果我們重發1那麼順序肯定就會亂了。

對於儲存端而言

訊息佇列不可能分割槽進行儲存,也就是乙個topic的訊息只能採用乙個佇列儲存,如果乙個topic採用多個佇列就不可能保證順序

對於消費者而言

對於消費端來說還不可以並行消費,也就是不可以開啟多執行緒或者多個客戶端來進行消費

假設我們現在想要保證s1和s2兩條訊息順序被消費可能想設計如上圖所示,假定生產者先傳送s1然後在傳送s2,如果想保證s1先被消費,那麼需要s1到達消費端後在通知mq2,然後mq2在傳送訊息。但是其實這是理想的模型,可能會出現如下2個問題

1、s1不一定要比s2先到mq集群(比如網路延遲)

2、s2到達mq集群並且已經消費完畢,s1還沒到達mq集群,這就會出現亂序

所有我們想要s1比s2先消費最簡單粗暴的方式就是s1和s2傳送同一臺server上,這樣根據佇列先進先出原則,肯定s1要比s2先消費

但是這種模型僅僅是理論上的可行,因為可能出現網路延遲,比如s2比是s1先到達消費端,我們同樣無法保證訊息的順序,這樣一來我們可能傳送s1等消費者響應後然後在發s2。

但是我們知道消費者可能出現2種情況

1、消費者沒有響應(可能消費成功沒有響應,也可能消費失敗沒有響應)

2、消費者響應成功

對於沒有響應的mq集群可以進行重發訊息,如果消費成功重發就會導致訊息重新處理,這樣一來就會帶來新的問題,重複問題下面說

綜上我們可以得出想保證訊息順序性最簡單可行方式就是生產者->mq->消費者這樣一一對應關係,但是同樣會帶來如下2個問題

1、吞吐量不足

2、可用性低

任何設計都離不開業務的本身,我們可以從業務來考慮順序訊息

1、不關注亂序的應用實際大量存在

2、佇列無序不表示訊息無序

注釋:對於同一種訊息放入同乙個佇列中,同一種訊息可以通過topic主題來進行標記。

綜上我們可以可以總結出來為了保證訊息的順序性要從生產者、儲存端、消費者三個角度來考慮

1、生產端必須保證訊息成功傳送以後才能繼續傳送第二條

2、儲存端必須要求同一種訊息必須存放在同乙個佇列中

3、消費端不可以採用併發消費

訊息重複由業務端來保證如上圖

生產者:ack確認機制訊息重發

消費者:手動ack確認,訊息重新請求,或者重試等

訊息佇列:如下圖所示

1、對於業務方進行限流,避免惡意刷訊息

2、伺服器採用負載均衡避免一台服務宕機而不可用

3、訊息採用持久化,避免斷電等原因導致訊息丟失

訊息佇列儲存一般採用邏輯儲存和物理儲存如下圖所示

1、邏輯儲存放入記憶體,主要儲存偏移量、訊息主題等,同時將儲存內容刷入磁碟避免丟失

2、物理採用檔案進行儲存,定期對檔案進行歸檔

訊息佇列的常見問題及解決

服務間解耦 提高服務併發 效能 突發流量削峰 服務間解耦 微服務系統業務之間相互依賴,各種呼叫錯綜複雜,如果不能良好對服務進行解耦那乙個服務的可用性 併發都會受到其他服務的影響。在沒有引用mq的之前服務呼叫大概是這些步驟 圖上的a服務是直接呼叫的,這是沒啥問題的,但是服務上線後要迭代更新的麻,這個時...

訊息推送服務Andriod 端常見問題

一 傳送訊息後接收不到 1 請檢視相關的配置資訊是否有問題。2 請確保整合的sdk版本是最新的版本,如果是舊版本出現問題,在新版本可能已經修復。3 檢查手機網路是否正常,切換4g網路測試一下。4 確認手機當前模式是正常模式,部分手機在低電量 勿擾模式 省電模式下,會對後台進行一系列網路和活動的 限制...

常見問題 朗動常見問題

常見問題一 方向盤變沉 檢查胎壓是否正常,輪胎是否過度磨損。助力幫浦不工作,前輪氣壓低。冬天的話,冷車在冬天助力油比較稠,方向會重一點。檢查轉向助力油。1 應該是是助力系統有問題或則助力潤滑油有問題。2 如果你在駕車時感覺方向盤變緊,汽車偏向一側,需要檢查輪胎,或進行車輪平衡 定位。在這些問題剛剛發...