面試之消息隊列

消息隊列場景

什么是消息隊列?

??消息隊列是一個使用隊列來通信的組件,它的本質就是個轉發器,包含發消息、存消息、消費消息。
在這里插入圖片描述

消息隊列怎么選型?

特性ActiveMQRabbitMQRocketMQKafka
單機吞吐量萬級萬級10萬級10萬級
時效性毫秒級微秒級毫秒級毫秒級
可用性高(主從)高(主從)非常高(分布式)非常高(分布式)
消息重復至少一次至少一次至少一次 最多一次至少一次最多一次
消息順序性有序有序有序分區有序
支持主題數千級百萬級千級百級,多了性能嚴重下滑
消息回溯不支持不支持支持(按時間回溯)支持(按offset回溯)
管理界面普通普通完善普通

消息隊列使用場景有哪些?

  • 異步處理:縮短用戶響應時間,提高系統吞吐量,各服務可獨立運行,互不干擾。
  • 應用解耦:降低系統間耦合度,一個系統的變更或故障不易影響其他系統,提升系統可維護性與擴展性。
  • 流量削峰:保護后端服務不被高流量沖垮,可按下游處理能力調節流量,避免系統崩潰 。

消息重復消費怎么解決?

??業務端對于已經消費成功的消息,保存在本地數據庫或Redis緩存業務中,進行業務表示,每次處理前先進行校驗,保證冪等性。

消息丟失怎么解決的?

在這里插入圖片描述
??消息生產階段:只要能正常接收到MQ中間件的ack確認響應,就表示發送成功,所以只要處理號消息的返回值和異常,如果返回異常則進行消息重發,那么這個階段是不會出現消息丟失的。
??消息存儲階段:生產者在發布消息是,MQ中間件通常會寫入多個節點,也就是創建多個副本,即便其中一個節點掛掉,也能保證集群的數據不丟失。
??消息消費階段:消費者接收消息并處理消息之后,才回復ack的話,那么消息是不會丟失的。不能收到消息就會回ack,否則可能消息處理中途就掛掉了,消息便丟失了。

消息隊列的可靠性怎么保證?

??消息持久化:在系統崩潰、重啟或者網絡故障等情況下,未處理的消息不會丟失。
??消息確認機制:消費者在成功處理消息后,應該向消息隊列發送確認(ack)。消息隊列只有收到確認后,才會將消息從隊列中移除。如果沒有收到確認,消息隊列會在一定時間內重發消息給消費者。
??消息重試策略:當消費者處理消息失敗后,需要選擇合適的重試策略。可以是設置重試次數和重試間隔時間;也可以是發送消息到死信隊列中,以便后續的排查和處理。

消息隊列的順序性怎么保證?

??有序消息處理場景的識別:明確業務場景中哪些消息是需要保證順序的,對于需要順序處理的消息,要確保消息隊列和消費者能夠按照特定的順序進行處理。
??消息隊列對順序性的支持:Kafka可以通過將消息劃分到同一個分區(Partition)來保證消息在分區內是有序的,消費者按照分區順序讀取消息就可以保證消息順序。但這也可能會限制消息的并行處理程度,需要在順序性和吞吐量之間進行權衡。
??消費者順序處理消息:消費者在處理消息時,應該避免并發處理可能導致的打亂情況。可以使用單線程或者使用對順序消息進行串行化處理后的線程池等方法,確保消息按照正確的順序被消費。

如何保證冪等性?

冪等性:同一操作的多次執行對系統狀態的影響與一次執行結果一致。

實現冪等性的核心方案:

  • 唯一標識(冪等鍵):客戶端為每一個請求生成全局唯一ID,服務端校驗該ID是否已處理,適用于場景:接口調用、消息消費等。
  • 數據庫事務+樂觀鎖:通過版本號或狀態字段控制并發更新,確保多次更新等同于單次操作,適用場景:數據庫記錄更新(如余額扣減、訂單狀態變更)。
  • 數據庫唯一約束:利用數據庫唯一索引防止重復數據寫入,適用場景:數據插入(如訂單創建)。
  • 分布式鎖:通過鎖機制保證同一時刻僅有一個請求執行關鍵操作,適用場景:高并發下的資源搶奪(如秒殺)。
  • 消息去重:消息隊列生產者為每一條消息生成唯一的消息ID,消費者在處理消息前,先檢查該消息ID是否已經處理過,如果已經處理過則丟棄該消息。

如何處理消息隊列的消息積壓問題?

原因:生產者的生產速度大于消費者的消費速度。

解決方案

  • 批量處理消息
  • 增加Topic的隊列數和消費組機器的數量
  • 臨時緊急擴容

臨時緊急擴容的大概思路:
1.先修復consumer消費者的問題,以確保其恢復消費速度,然后將現有consumer都停掉。
2.新建一個topic,partition是原來的10倍。臨時建立好原先10倍數量的queue。
3.寫一個臨時的分發數據的cunsumer程序,這個程序部署上去,消費積壓的數據,消費之后不做耗時的處理,直接輪詢寫入臨時建立好的10倍數量的queue。
4.接著臨時征用10倍的機器來部署consumer,每一批consumer消費一個臨時queue的數據。這個做法相當于是臨時將queue資源和consumer資源擴大10倍,以正常的10倍速度來消費數據。
5.等消息消費完積壓的數據后,恢復原先的部署架構,重新用原先的consumer機器來消費消息。

如何保證數據一致性,事務消息如何實現?

在這里插入圖片描述

  1. 生產者產生消息,發送帶MQ服務器
  2. MQ收到消息后,將消息持久化到存儲系統。
  3. MQ服務器返回Ack到生產者。
  4. MQ服務器把消息push給消費者
  5. 消費者消費完消息,響應ACK
  6. MQ服務器收到ACK,認為消息消費成功,即在存儲中刪除消息。
    在這里插入圖片描述
  7. 生產者產生消息,發送一條半事務消息到MQ服務器
  8. MQ收到消息后,將消息持久化到存儲系統,這條消息的狀態是待發送狀態。
  9. MQ服務器返回ACK確認到生產者,此時MQ不會觸發消息推送事件
  10. 生產者執行本地事務
  11. 如果本地事務執行成功,即commit執行結果到MQ服務器;如果執行失敗,發送rollback。
  12. 如果是正常的commit,MQ服務器更新消息狀態為可發送;如果是rollback,即刪除消息。
  13. 如果消息狀態更新為可發送,則MQ服務器會push消息給消費者。消費者消費完就回ACK。
  14. 如果MQ服務器長時間沒有收到生產者的commit或者rollback,它會反查生產者,然后根據查詢到的結果執行最終狀態。

消息隊列是參考哪種設計模式?

觀察者模式
觀察者模式實際上就是一對多的關系,即存在一個主題和多個觀察者,主題也是被觀察者,當主題發布消息時,會通知各個觀察者,觀察者將會收到最新消息。
在這里插入圖片描述
發布訂閱模式
發布訂閱模式和觀察者模式的區別就是發布者和訂閱者完全解耦,通過中間的發布訂閱中心進行消息通知,發布者并不知道自己發布的消息會通知給誰。
在這里插入圖片描述

讓你寫一個消息隊列,該如何進行架構設計?

在這里插入圖片描述

  1. 首先是消息隊列的整體流程,producer發送消息給broker,broker存儲好,broker再發送給consumer消費,consumer回復消費確認等。
  2. producer發送消息給broker,broker發消息給consumer消費,那就需要兩次RPC了,RPC如何設計呢?可以參考開源框架Dubbo,你可以說說服務發現、序列化協議等等
  3. broker考慮如何持久化呢,是放文件系統還是數據庫呢,會不會消息堆積呢,消息堆積如何處理呢。
  4. 消費關系如何保存呢?點對點還是廣播方式呢?廣播關系又是如何維護呢?zk還是config server
  5. 消息可靠性如何保證呢?如果消息重復了,如何冪等處理呢?
  6. 消息隊列的高可用如何設計呢?可以參考Kafka的高可用保障機制。多副本 -> leader & follower -> broker掛了重新選舉leader即可對外服務。
  7. 消息事務特性,與本地業務同個事務,本地消息落庫;消息投遞到服務端,本地才刪除;定時任務掃描本地消息庫,補償發送。
  8. MQ得伸縮性和可擴展性,如果消息積壓或者資源不夠時,如何支持快速擴容,提高吞吐?可以參照一下Kafka的設計理念,broker -> topic -> partition,每個partition放一個機器,就存一部分數據。如果現在資源不夠了,簡單啊,給topic增加partition,然后做數據遷移,增加機器,不就可以存放更多數據,提供更高的吞吐量了。

RocketMQ

消息隊列為什么選擇RocketMQ的?

  • 開發語言優勢:RocketMQ使用Java語言開發,更容易上手和閱讀源碼。
  • 社區氛圍活躍:RocketMQ是阿里巴巴開源且內部在大量使用的消息隊列,是經得起考驗的,并且能夠針對線上的復雜環境提供相應的解決方案。
  • 特性豐富:RocketMQ的高級特性達到了12種,例如順序消息、事務消息、消息過濾、定時消息等。豐富的特性,能夠為我們復雜的業務場景盡可能多地提供思路和解決方案。

RocketMQ和Kafka的區別是什么?如何做技術選型?

Kafka的優缺點

  • 優點:Kafka的最大優勢在于它的高吞吐量。Kafka支持集群部署,如果部分機器宕機不可用,則不影響Kafka的正常使用。
  • 缺點:Kafka有可能造成數據丟失,因為它在收發消息的時候,并不是直接寫入物理磁盤中,而是寫入到磁盤緩沖區里面的。Kafka功能比較單一,主要就是支持收發消息,造成使用場景受限。

RocketMQ的優缺點

  • 優點:支持功能多,比如延遲隊列、消息事務等等,吞吐量也高,支持大規模集群部署,線性擴展方便,Java語言開發,滿足了國內絕大多數公司的技術棧。
  • 缺點:性能相比Kafka弱一些,因為kafka用到了sendfile的零拷貝技術,而RockMQ主要是用mmap+write來實現零拷貝。

怎么選擇呢?

  • 如果業務只是收發消息,而且允許小部分的數據丟失,但要求極高的吞吐量和高性能的話,選擇kafka。
  • 如果公司需要通過mq實現一些業務需求,比如延遲隊列、消息事務等,且公司技術棧主要是Java的話,選RocketMQ

RocketMQ延時消息的底層原理

在這里插入圖片描述??broker在接受到消息的時候,會將延時消息存入到延時的Topic的隊列中,然后ScheduleMessageService對每個queue對應的定時任務不停的執行,檢查queue中哪些消息已到設定時間,然后轉發到消息的原始Topic,這些消息就會被各自的producer消費了。

RocektMQ怎么處理分布式事務?

??RocketMQ是一種最終一致性的分布式事務。
在這里插入圖片描述分布式事務的流程如上圖:

  1. A服務先發送個Half Message (是指暫不能被Consumer消費的消息。Producer已經把消息成功發送到了Broker端,但此消息被標記為暫不能投遞狀態,處于該種狀態下的消息稱為半消息。需要Producer對消息的二次確認后,Consumer才能去消費它) 給Brock端。
  2. 當A服務知道Half Message發送成功后,那么開始第3步執行本地事務。
  3. 執行本地事務(會有三種情況1、執行成功。2、執行失敗。3、網絡等原因導致沒有響應)
    1. 如果本地事務成功,那么Product像Brock服務器發送Commit,這樣B服務就可以消費該message。
    2. 如果本地事務失敗,那么Product像Brock服務器發送Rollback,那么就會直接刪除上面這條半消息。
    3. 如果因為網絡等原因遲遲沒有返回失敗還是成功,那么會執行RocketMQ的回調接口,來進行事務的回查。

從上面流程可以得知 只有A服務本地事務執行成功 ,B服務才能消費該message。

如果B最終執行失敗,幾乎可以斷定就是代碼有問題導致的異常,因為消費端RocketMQ有重試機制,如果不是代碼問題一般重試擊此就可以成功。
如果是代碼的原因引起多次重試失敗后,也沒有關系,將異常記錄下來,由人工處理。

RocketMQ消息順序怎么保證?

  • RocketMQ采用了局部順序一致性的機制,實現了單個隊列中的消息嚴格有序。
  • 在Producer(生產者)把一批需要保證順序的消息發送給同一個MessageQueue。
  • Consumer(消費者)則通過加鎖的機制來保證消息消費的順序性,Broker端通過對MessageQueue進行加鎖,保證同一個MessageQueue只能被同一個Consumer進行消費。

RocketMQ怎么保證消息不被重復消費

??在業務邏輯中實現冪等性,確保即使消息被重復消費,也不會影響業務狀態。

RocketMQ消息積壓了,怎么辦?

  • 擴展消費端的實例數來提升總體的消費能力。
  • 如果短時間內沒有足夠的服務器資源進行擴容,可進行系統降級,通過關閉一些不重要的業務,減少發送方的數據量,最低限度地讓系統還能正常運轉,服務一些重要業務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78460.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GStreamer 簡明教程(十一):插件開發,以一個音頻生成(Audio Source)插件為例

系列文章目錄 GStreamer 簡明教程(一):環境搭建,運行 Basic Tutorial 1 Hello world! GStreamer 簡明教程(二):基本概念介紹,Element 和 Pipeline GStreamer 簡明教程(三…

Linux kernel signal原理(下)- aarch64架構sigreturn流程

一、前言 在上篇中寫到了linux中signal的處理流程,在do_signal信號處理的流程最后,會通過sigreturn再次回到線程現場,上篇文章中介紹了在X86_64架構下的實現,本篇中介紹下在aarch64架構下的實現原理。 二、sigaction系統調用 #i…

華為OD機試真題——簡易內存池(2025A卷:200分)Java/python/JavaScript/C++/C/GO最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄全流程解析/備考攻略/經驗…

騰訊一面面經:總結一下

1. Java 中的 和 equals 有什么區別?比較對象時使用哪一個 1. 操作符: 用于比較對象的內存地址(引用是否相同)。 對于基本數據類型、 比較的是值。(8種基本數據類型)對于引用數據類型、 比較的是兩個引…

計算機網絡中的DHCP是什么呀? 詳情解答

目錄 DHCP 是什么? DHCP 的工作原理 主要功能 DHCP 與網絡安全的關系 1. 正面作用 2. 潛在安全風險 DHCP 的已知漏洞 1. 協議設計缺陷 2. 軟件實現漏洞 3. 配置錯誤導致的漏洞 4. 已知漏洞總結 舉例說明 DHCP 與網絡安全 如何提升 DHCP 安全性 總結 D…

2025 年導游證報考條件新政策解讀與應對策略

2025 年導游證報考政策有了不少新變化,這些變化會對報考者產生哪些影響?我們又該如何應對?下面就為大家詳細解讀新政策,并提供實用的應對策略。 最引人注目的變化當屬中職旅游類專業學生的報考政策。以往,中專學歷報考…

【物聯網】基于LORA組網的遠程環境監測系統設計(ThingsCloud云平臺版)

演示視頻: 基于LORA組網的遠程環境監測系統設計(ThingsCloud云平臺版) 前言:本設計是基于ThingsCloud云平臺版,還有另外一個版本是基于機智云平臺版本,兩個設計只是云平臺和手機APP的區別,其他功能都一樣。如下鏈接: 【物聯網】基于LORA組網的遠程環境監測系統設計(機…

SQL 函數進行左邊自動補位fnPadLeft和FORMAT

目錄 1.問題 2.解決 方式1 方式2 3.結果 1.問題 例如在SQL存儲過程中,將1 或10 或 100 長度不足的時候,自動補足長度。 例如 1 → 001 10→ 010 100→100 2.解決 方式1 SELECT FORMAT (1, 000) AS FormattedNum; SELECT FORMAT(12, 000) AS Form…

Nacos簡介—2.Nacos的原理簡介

大綱 1.Nacos集群模式的數據寫入存儲與讀取問題 2.基于Distro協議在啟動后的運行規則 3.基于Distro協議在處理服務實例注冊時的寫路由 4.由于寫路由造成的數據分片以及隨機讀問題 5.寫路由 數據分區 讀路由的CP方案分析 6.基于Distro協議的定時同步機制 7.基于Distro協…

中電金信聯合阿里云推出智能陪練Agent

在金融業加速數智化轉型的今天,提升服務效率與改善用戶體驗已成為行業升級的核心方向。面對這一趨勢,智能體與智能陪練的結合應用,正幫助金融機構突破傳統業務模式,開拓更具競爭力的創新機遇。 在近日召開的阿里云AI勢能大會期間&…

十分鐘恢復服務器攻擊——群聯AI云防護系統實戰

場景描述 服務器遭遇大規模DDoS攻擊,導致服務不可用。通過群聯AI云防護系統的分布式節點和智能調度功能,快速切換流量至安全節點,清洗惡意流量,10分鐘內恢復業務。 技術實現步驟 1. 啟用智能調度API觸發節點切換 群聯系統提供RE…

LLM量化技術全景:GPTQ、QAT、AWQ、GGUF與GGML

01 引言 本文介紹的是在 LLM 討論中經常聽到的各種量化技術。本文的目的是提供一步一步的解釋和代碼,讓大家可以自己使用這些技術來壓縮模型。 閑話少說,我們來研究一下吧! 02 Quantization 量化是指將高精度數字轉換為低精度數字。低精…

IP的基礎知識以及相關機制

IP地址 1.IP地址的概念 IP地址是分配給連接到互聯網或局域網中的每一個設備的唯一標識符 也就是說IP地址是你設備在網絡中的定位~ 2.IP版本~ IP版本分為IPv4和IPv6,目前我們最常用的還是IPv4~~但是IPv4有個缺點就是地址到現在為止,已經接近枯竭~~&…

本地使用Ollama部署DeepSeek

以下是在本地使用Ollama部署DeepSeek的詳細教程,涵蓋安裝、修改安裝目錄、安裝大模型以及刪除大模型的操作步驟。 安裝Ollama 1. 系統要求 確保你的系統滿足以下條件: 操作系統:macOS、Linux或者Windows。足夠的磁盤空間和內存。 2. 安裝…

開源項目實戰學習之YOLO11:ultralytics-cfg-datasets-Objects365、open-images-v7.yaml文件(六)

👉 點擊關注不迷路 👉 點擊關注不迷路 👉 點擊關注不迷路 medical - pills.yaml 通常用于配置與醫學藥丸檢測任務相關的參數和信息 Objects365.yaml 用于配置與 Objects365 數據集相關信息的文件。Objects365 數據集包含 365 個不同的物體類別…

23種設計模式-行為型模式之策略模式(Java版本)

Java 策略模式(Strategy Pattern)詳解 🧠 什么是策略模式? 策略模式是一種行為型設計模式,它定義了一系列算法,把它們一個個封裝起來,并且使它們可以互相替換。策略模式讓算法獨立于使用它的客…

使用 AI Agent 改善師生互動的設計文檔

使用 AI Agent 改善師生互動的設計文檔 一、引言 1.1 研究背景 當前教育領域的師生互動存在諸多挑戰,如教師負擔過重、學生個體差異大導致難以滿足所有人的需求,以及信息傳遞延遲等問題。引入AI-Agent能夠有效緩解這些問題,通過自動化手段協…

2、Ubuntu 環境下安裝RabbitMQ

?. 安裝Erlang RabbitMqRabbitMq需要Erlang語?的?持,在安裝rabbitMq之前需要安裝erlang需要Erlang語?的?持,在安裝rabitMq之前需要安裝erlang。 安裝erlang # 更新軟件包 sudo apt-get update # 安裝 erlang sudo apt-get install erlang 查看er…

Node.js 操作 ElasticSearch 完整指南:從安裝到實戰

本文將手把手教你如何搭建 ElasticSearch 環境,并通過 Node.js 實現高效數據檢索。包含 10 個可直接復用的代碼片段,助你快速掌握搜索、聚合等核心功能! 環境搭建篇 1. ElasticSearch 安裝要點 下載 es下載連接 下載下來后,進…

硬核科普丨2025年安全、高效網絡準入控制系統深度解析

陽途網絡準入控制系統(Network Access Control,簡稱NAC)是當代網絡安全領域的重要工具,有效防止未經授權的訪問和數據泄露,保障網絡資源的安全性和完整性。本文將深入探討陽途網絡準入控制系統的的重要性和作用。 一、…