java八股文之消息中間件

1.RabbitMQ如何保證消息不丟失

  1. 開啟生產者確認機制,確保生產者的消息能到達隊列
  2. 開啟持久化功能,確保消息未消費前在隊列中不會丟失(交換機,隊列,消息都需要開啟持久化功能)
  3. 開啟消費者確認機制為auto,由spring確認消息處理成功后完成ack
  4. 開啟消費者失敗重試機制(比如設置最多重試次數為3),多次重試失敗后將消息投遞到異常交換機,交由人工處理

2.說一說消息重復消費問題

  1. 導致消息重復的原因一般是設置了消息重試機制。但是由于網絡抖動或者消費者掛了,導致消息沒有被確認還在消息隊列中,然后重復發送導致的
  2. 解決這個問題最好的方法是用唯一標識去處理,消費時候去數據庫查一下,如果這個消息的唯一標識已經存在了,那么就是已經消費過了
  3. 其次是可以用redis分布式鎖或者數據庫鎖(樂觀鎖,悲觀鎖)去解決。

3.說一說RabbitMQ中死信交換機(RabbitMQ延遲隊列)

  1. 延遲隊列一般的應用場景有超時訂單、限時優惠、定時發布等
  2. 延遲隊列是用到了死信交換機和TTL(消息存活時間)實現的
  3. 消息超時未消費就會變成死信(死信的其他情況:拒絕被消費,隊列滿了)
  4. 死信會被放到死信交換機里面,由死信交換機綁定的隊列去消費(死信交換機在創建消息隊列的時候就需要去指定死信交換機是誰)。
  5. 延遲隊列插件也可以實現延遲隊列(DelayExchange),發送消息時,添加x-delay頭,值為超時時間

4.消息堆積問題如何解決

  1. 增加更多的消費者,提高消費速度
  2. 在消費者內使用線程池,提高消息處理速度
  3. 使用惰性隊列,把消息放在磁盤里面,獲得更高的存儲上限。但是這樣受限于磁盤IO,時效性會降低。

5.RabbmitMq怎么解決高可用

  1. 采用鏡像模式搭建集群,鏡像的結構是一主多從,所有操作時主節點完成,之后同步給從節點。如果主節點宕機,鏡像節點會成為新的主節點。但是如果在同步之前主節點就掛了,可能會造成數據丟失。
  2. 采用仲裁隊列解決鏡像集群可能出現的數據丟失問題,仲裁隊列和鏡像隊列一樣都是主從模式,主從同步基于Raft協議,強一致。且使用起來也很方便,只要聲明隊列的時候表示是仲裁隊列即可。

Raft協議: Raft是一種旨在簡化實現和理解的分布式系統共識算法。其核心在于通過選舉一個“領導者”來處理客戶端請求,并將這些請求作為日志條目復制到其他“跟隨者”節點,以確保所有節點數據的一致性。每個節點在任一時刻都處于三種狀態之一:領導者、跟隨者或候選人(用于選舉新領導者)。Raft通過任期(邏輯時鐘)和嚴格的日志復制規則保證了即使部分節點故障,系統仍能保持一致性和可用性。簡而言之,Raft使分布式系統能夠高效、可靠地達成共識,確保數據一致性。

6.Kafka如何保證消息不丟失

需要從三個層面去解決這個問題:

  • 生產者發送消息到Brocker丟失
    – 設置異步發送,發送失敗使用回調進行記錄或重發
    – 失敗重試,參數配置,可以設置重試次數
  • 消息在Brockert中存儲丟失
    發送確認acks,選擇all,讓所有的副本都參與保存數據后確認,但是這樣效率最低,可以設置為1,只要集群首領收到消息,即可發送消息確認。
  • 消費者從Brocker接收消息丟失
    – 關閉自動提交偏移量,開啟手動提交偏移量
    – 提交方式,最好是同步+異步提交

7.Kafka中消息的重復消費問題如何解決的

  • 關閉自動提交偏移量,開啟手動提交偏移量
  • 提交方式,最好是同步+異步提交
  • 使用冪等方案

8.Kafka消費如何保證順序性

在kafka中,一個topic的數據存儲在不同的分區中,每個分區都有按照順序存儲的偏移量,這就導致如果一個消費者關聯了多個分區,分區就不能保證連續性。
解決:

  1. 發送消息時指定分區號,將需要順序消費的消息全部發送到同一分區
  2. 發送消息時,按照業務設置相同的key,核心依然是將需要順序消費的信息全部發送給同一分區,以此保證消息消費的順序性

9.Kafka高可用機制了解過嗎

Kafka高可用機制主要體現在兩個方面
集群:
一個kafka集群由多個broker3實例組成,即使某一臺宕機,也不耽誤其他broker繼續對外提供服務
復制機制:

  • 一個topic有多個分區,每個分區有多個副本,有一個leader,其余的是follower,副本存儲在不同的broker中
  • 所有的分區副本的內容是都是相同的,如果leader發生故障時,會自動將其中一個follower提升為leader,保證了系統的容錯性、高可用性
  • 分區副本分為兩類
    一類是ISR,需要同步保存數據的副本,leader掛掉之后,會優先從ISR選取,一般建議設置一到兩個,因為是同步復制,多了影響效率
    一類是普通副本,異步同步數據

10.說一說Kafka的數據清理機制

需要先說明kafka存儲結構

  • Kafka中topic的數據存儲在分區上,一個分區如果過大就會進行分段存儲,及一個分區下可能會存在多個文件段,一個文件段被稱為segment
  • 每個文件段都對應了三個日志文件:索引文件(xxx.index)、數據文件(xxx.log)、時間索引文件(xxx.timeindex)。每段的文件名相同,后綴不同
  • 分段的好處是,第一能夠減少單個文件內容的大小,查找數據方便,第二方便kafka進行日志清理。

再說明kafaka的兩個日志的清理策略

  • 根據消息的保留時間,當消息保存的時間超過了指定的時間,就會觸發清理,默認是168小時(7天)
  • 根據topic存儲的數據大小,當topic所占的日志文件大小大于一定的閾值,則開始刪除最久的消息。(默認關閉)

11.說一說kafka的高性能設計

  • 消息分區: 不受單臺服務器的限制,可以不受限的處理更多的數據
  • 順序讀寫: 磁盤順序讀寫,提升讀寫效率(文件內容是追加寫入的)
  • 頁緩存: 把磁盤中的數據緩存到內存中,把對磁盤的訪問變為對內存的訪問
  • 零拷貝: 減少上下文切換及數據拷貝
  • 消息壓縮:減少磁盤IO和網絡O
  • 分批發送:將消息打包批量發送,減少網絡開銷

零拷貝

普通拷貝:

  • 從硬件中的磁盤文件到內核空間的頁緩存一次
  • 從內核空間的頁緩存到用戶空間的kafka一次
  • 從用戶空間的kafka到內核空間的Socket緩沖區一次
  • 從內核空間的Socket緩沖區到硬件中的網卡一次
    共進行了四次拷貝

零拷貝:

  • 從硬件中的磁盤文件到內核空間的頁緩存一次
  • 從內核空間的頁緩存到硬件中的網卡一次
    共進行了兩次拷貝

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

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

相關文章

Win7重裝不翻車!ISO鏡像安全下載渠道+BIOS設置避雷手冊

一、寫在前面:為什么你需要這份教程? 當電腦頻繁藍屏、系統崩潰甚至無法開機時,重裝系統可能是最后的救命稻草。但市面上的教程往往存在三大痛點: ?? 鏡像來源不明導致系統被植入后門 ?? 啟動盤制作失敗反復折騰 ?? 操作失…

大學至今的反思與總結

現在是2025年的3月5日,我大三下學期。 自大學伊始,我便以考研作為自己的目標,有時還會做自己考研上岸頭部985,211,offer如潮水般涌來的美夢。 但是我卻忽略了一點,即便我早早下定了決心去考研,但并沒有早…

SpringBoot 全局異常處理

文章目錄 異常處理全局異常處理(推薦)局部異常處理高級技巧設置返回狀態碼處理404異常異常處理 全局異常處理(推薦) 創建一個全局異常處理類,使用 @RestControllerAdvice 注解標記。 在方法上使用 @ExceptionHandler 聲明當前方法可處理的異常類型。當系統發生異常時,…

【四.RAG技術與應用】【11.阿里云百煉應用(上):RAG在云端的實踐】

一、為什么需要RAG?大模型的“知識困境”與破局之道 大模型雖然“博學”,但它的知識庫存在兩個致命短板: 缺乏私有知識:比如企業內部的產品手冊、客戶數據、行業報告等;知識更新滯后:大模型的訓練數據往往停留在某個時間點,無法實時獲取最新信息(比如今天的股票行情或…

使用wifi連接手機adb進行調試|不使用數據線adb調試手機|找應用錯誤日志和操作日志

手機在開發者選項里要開啟無線調試 在手機設置中查看WiFi的IP地址 設置 -> WLAN -> 已連接的WiFi -> IP地址 使用手機的IP地址連接 adb connect 192.168.1.12:xxxxx 檢查連接狀態 adb devices 斷開特定設備 adb disconnect 192.168.x.x:xxxxx 斷開所有設備 …

mapbox高階,結合threejs(threebox)添加三維球體

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??threebox Sphere靜態對象二、??使用t…

游戲引擎學習第140天

回顧并為今天的內容做準備 目前代碼的進展到了聲音混音的部分。昨天我詳細解釋了聲音的處理方式,聲音在技術上是一個非常特別的存在,但在游戲中進行聲音混音的需求其實相對簡單明了,所以今天的任務應該不會太具挑戰性。 今天我們會編寫一個…

golang并發編程如何學習

《掌握 Golang 并發編程的通關秘籍》 在當今的編程世界中,Golang 并發編程正以其獨特的魅力和強大的能力吸引著眾多開發者。然而,對于許多小伙伴來說,如何學好這門技術卻成了一個頭疼的問題。別擔心,今天就讓我來為大家揭開 Gola…

SpringMVC學習(controller層加載控制與(業務、功能)bean加載控制、Web容器初始化配置類)(3)

目錄 一、SpringMVC、Spring的bean加載控制。 &#xff08;1&#xff09;實際開發的包結構層次。 &#xff08;2&#xff09;如何"精準"控制兩個容器分別加載各自bean。(分析) <1>SpringMVC相關bean加載控制。(方法) <2>Spring相關bean加載控制。(方法) …

fastapi+mysql實現增刪改查

說明&#xff1a; 我計劃用python的fastapi框架&#xff0c;實現操作MySQL數據庫的表&#xff0c;實現增刪改查的操作&#xff0c;并且在postman里面測試 step1: 安裝數據庫依賴 pip install fastapi uvicorn pymysqlstep2:C:\Users\Administrator\PycharmProjects\FastAPIPro…

Linux系統之配置HAProxy負載均衡服務器

Linux系統之配置HAProxy負載均衡服務器 前言一、HAProxy介紹1.1 HAProxy簡介1.2 主要特點1.3 使用場景二、本次實踐介紹2.1 本次實踐簡介2.2 本次實踐環境規劃三、部署兩臺web服務器3.1 運行兩個Docker容器3.2 編輯測試文件3.3 訪問測試四、安裝HAProxy4.1 更新系統軟件源4.2 安…

CS144 Lab Checkpoint 2: the TCP receiver

Overview TCPReceiver 從對等的sender接收消息&#xff0c;使用 receive() 方法&#xff0c;然后調用 Reassembler() 方法&#xff0c;后者寫入 ByteStream 中 然后應用程序從 ByteSteam 中讀取。 同時&#xff0c;TCPReceiver 還會通過 send() 方法給sender發送消息&#xff…

Spring Boot 3.x 核心注解詳解與最佳實踐

Spring Boot 3.x 核心注解詳解與最佳實踐 前言 隨著Spring Boot 3.x的正式發布&#xff0c;這個基于Spring Framework 6的里程碑版本帶來了諸多新特性。本文將深入剖析Spring Boot 3.x的核心注解體系&#xff0c;結合代碼示例講解其作用及使用場景&#xff0c;助您快速掌握新…

PHP之常量

在你有別的編程語言的基礎下&#xff0c;你想學習PHP&#xff0c;可能要了解的一些關于常量的信息。 PHP中的常量不用指定數據類型&#xff0c;可以使用兩次方法定義。 使用const //定義常量 const B 2; echo B . PHP_EOL;使用define define("A", 1); echo A . P…

計算機網絡——子網掩碼

一、子網掩碼是什么&#xff1f;它長什么樣&#xff1f; 子網掩碼的定義 子網掩碼是一個32位的二進制數字&#xff0c;與IP地址“配對使用”&#xff0c;用于標識IP地址中哪部分屬于網絡地址&#xff0c;哪部分屬于主機地址。 示例&#xff1a;IP地址 192.168.1.10&#xff0c;…

Tomcat-web服務器介紹以及安裝部署

一、Tomcat簡介 Tomcat是Apache軟件基金會&#xff08;Apache Software Foundation&#xff09;的Jakarta 項目中的一個核心項目&#xff0c;由Apache、Sun和其他一些公司及個人共同開發而成。 Tomcat服務器是一個免費的開放源代碼的Web應用服務器&#xff0c;屬于輕量級應用…

分布式存儲—— HBase數據模型 詳解

目錄 1.3 HBase數據模型 1.3.1 兩類數據模型 1.3.2 數據模型的重要概念 1.3.3 數據模型的操作 1.3.4 數據模型的特殊屬性 1.3.5 CAP原理與最終一致性 1.3.6 小結 本文章參考、總結于學校教材課本《HBase開發與應用》 1.3 HBase數據模型 在開始學習HBase之前非常…

android中activity1和activity2中接收定時消息

android中activity1和activity2中接收定時消息 業務類 import java.util.Timer; import java.util.TimerTask;public class MyAnager {private MyAnager() {}private static MyAnager instance;//回調接口onRecvTaskpublic interface OnMsgListener {void onRecvTask(String a…

BitMap實現用戶簽到、UV統計

1. Redis 的 BitMap 概述 在 Redis 中&#xff0c;BitMap 并非一種獨立的數據結構&#xff0c;而是基于 String 類型數據結構實現的一種存儲方式。由于 String 類型的最大上限是 512M&#xff0c;換算成 bit 位就是 2^32 個&#xff0c;這決定了 BitMap 可操作的最大范圍。Bit…

共享模型之管程(悲觀鎖)

共享模型之管程&#xff08;悲觀鎖&#xff09; 文章目錄 共享模型之管程&#xff08;悲觀鎖&#xff09;一、常見線程安全的類二、對象頭三、Monitor&#xff08;監視器 / 管程&#xff09;四、偏向鎖偏向鎖的實現原理撤銷偏向鎖 五、輕量級鎖輕量級鎖的釋放 六、重量級鎖七、…