MQ的相關理論和思考

来源:https://www.cnblogs.com/wpccc/archive/2020/05/01/12814502.html
-Advertisement-
Play Games

1. MQ的優缺點 優點: 解耦:通過MQ解除上游系統和下游系統的調用耦合,下游系統只需要做消息的訂閱和取消訂閱,上游系統無需任何改動。(一生產,多消費的典型場景) 非同步:通過MQ將一些不需要同步獲取執行的結果,並且非常耗時的調用操作通過MQ非同步化。 削峰:通過MQ將一些高峰期的高併發流量積壓在MQ ...


1. MQ的優缺點

優點:

  • 解耦:通過MQ解除上游系統和下游系統的調用耦合,下游系統只需要做消息的訂閱和取消訂閱,上游系統無需任何改動。(一生產,多消費的典型場景)
  • 非同步:通過MQ將一些不需要同步獲取執行的結果,並且非常耗時的調用操作通過MQ非同步化。
  • 削峰:通過MQ將一些高峰期的高併發流量積壓在MQ中,下游可以按自己的消費能力消費,不會出現過載消費的情況。

缺點:

  • 可用性降低:如果MQ出現了問題,依賴MQ環節的服務都會出現癱瘓
  • 複雜性提高:給系統引入額外的組件,調用鏈變長,變複雜。同時需要考慮的事情會變多(消息冪等,丟失,積壓等等)
  • 數據一致性:下游服務執行部分失敗,導致數據不一致  

2. MQ的選型

Kafka:

  • 吞吐量:10w級別,吞吐量是Kafka最大的優點。
  • 時效性:ms以內
  • Topic數量對吞吐量的影響:topic達到幾百上千,吞吐量有較小幅度下降
  • 應用場景:主要用於大數據做日誌採集,實時數據計算等場景。
  • 高可用性:分散式系統架構,
  • 優劣勢:功能簡單,但是吞吐量大,並且天然適合大數據採集和計算

RocketMQ:

  • 吞吐量:10w級別,
  • 時效性:ms
  • Topic數量對吞吐量的影響:topic達到幾百上千,吞吐量有較小幅度下降
  • 應用場景:吞吐量大的業務場景
  • 高可用性:分散式系統架構,易擴展
  • 優劣勢:介面移動,阿裡開源,有大規模的應用,社區活躍度高,可靠性ok

RabbitMQ:

  • 吞吐量:萬級,比kafka和RocketMQ低了一個量級
  • 時效性:微秒級別,延遲最低
  • 應用場景:
  • 高可用性:主從架構實現高可用
  • 優劣勢:erlang開發,時效性極好,開源版本提供的管理頁面友好,強大。實現的機制較重,吞吐量較低

ActiveMQ:

  • 吞吐量:萬級,比kafka和RocketMQ低了一個量級
  • 時效性:ms
  • 應用場景:主要還是非同步和削峰
  • 高可用性:主從架構實現高可用
  • 優劣勢:較低概率可能會丟消息,同時開源社區不夠活躍,目前更新較慢,假設遇到問題會很難解決。

3. 如何保證MQ的高可用 

RabbitMQ:

  單機模式,普通集群模式(中心化的),鏡像集群模式(queue對等,實時性差,網路負載重,不可線性拓展)

 

Kafka:

  分散式架構,有多個broker(master,slave)。比如一個topic,數據不是分佈在一臺機器上,利於水平拓展。同時提供多副本機制保證高可用,針對一個topic下的副本,只能寫入到leader,然後同步到follower。是中心化的。broker之間的協調是通過zk完成的,選出一個controller,然後決定每個partition的主從。

RocketMQ:

  分散式架構,有多個broker。和kafka不同,針對一個topic,在每個broker上會有多個queue,消息的消費是針對queue的,消息的冗餘是通過主從複製,有同步複製和非同步。broker的協調是通過nameServer來完成的,不同於kafka,RocketMQ沒有選舉機制,因為broker對等,一個broker掛了則由其他的broker處理請求,相當於剔除了這個broker。

4. 如何保證消息的冪等性

 產生重覆消費的可能性:

  • 消費者重啟前沒提交消費到的數據index,可能會導致重覆消費
  • 網路抖動導致消費確認消息沒到達MQ,可能會導致重覆消費

 保證冪等的手段:

  • 如果是mysql,可以通過主鍵或者唯一索引等保證。 如果是redis,可以通過key保證
  • 給每個消息增加一個全局唯一的id,然後通過redis做冪等性判斷,這裡可能會涉及到redis的事務原子性  

5. 如何保證消息的可靠性

RocketMQ

  1>從producer的角度

  • 預設是同步堵塞的方式,可以通過返回值確認消息投遞到了broker
  • 如果是事務的方式,如果投遞失敗,會把消息存到commitLog中去
  • 支持日誌索引,投遞不成功的消息可以通過提供的API查詢到

  2>從broker的角度

  • 消息是會同步到commitLog中的,就算broker宕機也是能載入出來的
  • broker支持同步刷盤和非同步刷盤
  • broker支持主從部署

  3>從consumer的角度

  • consumer在消息消費的時候會記錄成功消費消息或者已經發回到broker的offset
  • consumer維護的offset是會持久化的,就算consumer和broker都掛了,重啟的時候,consumer會讀取offset在發送給broker
  • consumer消費失敗的時候會重試,然後更新offset

6. 如何保證消息的消費順序

  順序消息包含兩種類型:

    分區順序:一個Partition內所有的消息按照先進先出的順序進行發佈和消費

    全局順序:一個Topic內所有的消息按照先進先出的順序進行發佈和消費

  RocketMQ:我們知道針對一個topic是會有多個queue的,所以首先需要保證順序消費的消息是發到同一個queue中的,通過提供的分區函數保證消息能夠丟到一個queue中就好。 但是這樣只能保證分區順序,全局順序的話那就是只有一個分區。

7. 消息隊列里積壓了很多消息怎麼辦

  可以通過臨時擴容,增加消費者數量,排查原先消費者出現的問題


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個問題比較常見了,一般是在第一次上傳項目到github或者gitee上會出現。 以前將項目上傳到github的時候出現這個問題,百般查找,找到一個好用的解決辦法,依次輸入以下命令: git pull git pull origin master git pull origin master --a ...
  • Sleuth+Zipkin用來實現分散式系統的鏈路追蹤。 Sleuth組件用於日誌埋點、記錄鏈路數據,Zipkin組件用於展示鏈路數據。 Sleuth的使用 (1)創建消費者、提供者時勾選Spring Cloud Tracing -> Sleuth 也可以手動添加依賴: <dependency> < ...
  • 會話技術 1. 會話:一次會話中包含多次請求和響應 一次會話:瀏覽器第一次給伺服器發送請求,會話建立,直到有一方斷開為止 2. 功能:在一次會話的範圍內的多次請求間,共用數據 3. 方式: 1. 客戶端會話技術:Cookie 2. 伺服器端會話技術:Session Cookie 1. 概念:客戶端會 ...
  • 1. Image.open(fp, mode="r") 調用此方法需要引入頭文件:from PIL import Image。 參數說明: fp:圖片路徑,可為絕對路徑或相對路徑。 model:預設即可。 2. 例子 2.1 Code 首先給定圖片路徑,然後調用函數Image.open()即可。 1 ...
  • 一、準備環境 1. 雲主機和功能變數名稱 雲主機 推薦使用阿裡雲或者騰訊雲的ecs主機,如果有學生證的話都很便宜。 功能變數名稱 國內的話,在阿裡雲或者騰訊雲購買都可以,國內功能變數名稱都需要備案,備案按照文檔去做。 ssl證書 雲服務商一般都有免費的ssl證書申請,也可以使用let's encrypt的證書。 2. 公眾 ...
  • 1. cv2.imread(filename, flags=None) 需要引入頭文件: import cv2 參數說明: filename: 文件路徑,絕對路徑和相對路徑都可以。 2. 例子 2.1 Code 首先定義路徑,然後直接調用函數cv2.imread()即可。 1 import cv2 ...
  • 1. repeat_interleave(self: Tensor, repeats: _int, dim: Optional[_int]=None) 參數說明: self: 傳入的數據為tensor repeats: 複製的份數 dim: 要複製的維度,可設定為0/1/2..... 2. 例子 2 ...
  • SpringBoot(十二)過濾器詳解 往期精彩推薦 "SpringBoot系列(一)idea新建Springboot項目" "SpringBoot系列(二)入門知識" "springBoot系列(三)配置文件詳解" "SpringBoot系列(四)web靜態資源配置詳解" "SpringBoot系 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...