中間件-RocketMQ

RocketMQ

  • 基本架構
  • 消息模型
  • 消費者消費消息模式
  • 順序消息機制
  • 延遲消息
  • 批量消息
  • 事務消息
  • 消息重試
  • 最佳實踐

基本架構

在這里插入圖片描述

nameServer: 維護broker列表信息,客戶端連接時只需要連接nameServer。可配置成集群。
broker:broker分為master和slave,master負責消息的發送和消費,slave是master的備份。master-slaver的集群方式,master掛掉時候slave不能主動轉換為master提供服務(5.X版本后可以通過配置實現mater掛掉后slave轉為master提供服務)。
leader-follower的集群方式,即高可用集群,各個broker是對等的,通過選舉產生leader(在dashboart中顯示為master),如果leader掛掉,在剩下的follower(顯示為slave)中選舉再產生新的leader。注意,只有超過半數的幾點存活,才能選舉出leader。

消息模型

在這里插入圖片描述
?產者和消費者都可以指定?個Topic發送消息或者拉取消息。?Topic是?個邏輯概念。
Topic中的消息會分布在后?多個MessageQueue當中。這些MessageQueue會分布到?個或者多個broker中。

消費者消費消息模式

廣播模式:所有關注topic的消費者都收到消息。廣播模式下消息隊列的消費位點由客戶端自己維護,消費失敗服務端不會重發。
集群模式:同一個消費者組只有一個成員收到消息。集群模式下消費點位由服務端維護,消費者組的所有成員共用一個位點,消費失敗服務端會重發。

順序消息機制

  1. ?產者只有將?批有順序要求的消息,放到同?個MesasgeQueue上,通過MessageQueue的FIFO特性保證這?批消息的順序。如果不指定MessageSelector對象,
    那么?產者會采?輪詢的?式將多條消息依次發送到不同的MessageQueue上。
  2. 消費者需要實現MessageListenerOrderly接?,實際上在服務端,處理MessageListenerOrderly時,會給?個MessageQueue加鎖,拿到MessageQueue上所有的消息,然后再去讀取下?個MessageQueue的消息。
  3. 消費消息失敗時,不建議拋出異常,可以返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT作為替代。因為消費者端只進?有限次數的重試。如果?條消息處理失敗,RocketMQ會將后續消息阻塞住,讓消費者進?重試。但是,如果消費者?直處理失敗,超過最?重試次數,那么RocketMQ就會跳過這?條消息,處理后?的消息,這會造成消息亂序。

延遲消息

  1. 定固定的延遲級別:對于指定固定延遲級別的延遲消息,RocketMQ的實現?式是預設?個系統Topic,名字叫做SCHEDULE_TOPIC_XXXXX。在這個Topic下,預設了18個MessageQueue。這?每個對列就對應了?種延遲級別。然后每次掃描這18個隊列?的消息,進?延遲操作就可以了。
  2. 指定消息發送時間:RocketMQ是通過時間輪算法實現。

批量消息

?產者要發送的消息?較多時,可以將多條消息合并成?個批量消息,?次性發送出去。這樣可以減少?絡IO,提升消息發送的吞吐量。同?批消息的Topic必須相同,另外,不?持延遲消息。還有批量消息的??不要超過1M,如果太?就需要??分割。

事務消息

在這里插入圖片描述

  1. ?產者將消息發送?ApacheRocketMQ服務端。
  2. ApacheRocketMQ服務端將消息持久化成功之后,向?產者返回Ack確認消息已經發送成功,此時消息被標記為"暫不能投遞",這種狀態下的消息即為半事務消息。
  3. ?產者開始執?本地事務邏輯。
  4. ?產者根據本地事務執?結果向服務端提交?次確認結果(Commit或是Rollback),服務端收到確認結果后處理邏輯如下:?次確認結果為Commit:服務端將半事務消息標記為可投遞,并投遞給消費者。?次確認結果為Rollback:服務端將回滾事務,不會將半事務消息投遞給消費者。
  5. 在斷?或者是?產者應?重啟的特殊情況下,若服務端未收到發送者提交的?次確認結果,或服務端收到的?次確認結果為Unknown未知狀態,經過固定時間后,服務端將對消息?產者即?產者集群中任??產者實例發起消息回查。
  6. ?產者收到消息回查后,需要檢查對應消息的本地事務執?的最終結果。
  7. ?產者根據檢查到的本地事務的最終狀態再次提交?次確認,服務端仍按照步驟4對半事務消息進?處理。

消息重試

RocketMQ的消費者端,如果處理消息失敗了,Broker是會將消息重新進?投送的。?在重試時,RocketMQ實際上會為每個消費者組創建?個對應的重試隊列。重試的消息會進??個“%RETRY%”+ConsumeGroup的隊列中。
RocketMQ默認允許每條消息最多重試16次,每次重試的間隔時間如下:
在這里插入圖片描述
如果消息重試16次后仍然失敗,消息將不再投遞,轉為進?死信隊列。重試次數可以通過consumer.setMaxReconsumeTimes(20);將重試次數設定為20次。當定制的重試次數超過16次后,消息的重試時間間隔均為2?時。
如果消息超過最?重試次數,RocketMQ會將消息發送到死信隊列。?個死信隊列對應?個消費組。死信隊列的默認權限為2(禁讀)。如果需要處理死信隊列的消息,需要把權限修改為6(可讀可寫后)消費該Topic的消息進行處理。隊列中超過有效期(默認3天)的消息會被刪除,不管有沒有消費。

最佳實踐

  1. ?個應?盡可能??個Topic,?消息?類型則可以?tags來標識。tags過濾消息的性能很高,相當于索引。
  2. 消費端冪等控制:RocketMQ的每條消息都有?個唯?的MessageId,這個參數在多次投遞的過程中是不會改變的,所以業務上可以?這個MessageId來作為判斷冪等的關鍵依據。但是,這個MessageId是?法保證全局唯?的,也會有沖突的情況。所以在?些對冪等性要求嚴格的場景,最好是使?業務上唯?的?個標識?較靠譜。例如訂單ID。?這個業務標識可以使?Message的Key來進?傳遞。

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

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

相關文章

anaconda3如何切換虛擬環境

在 Anaconda3 中切換虛擬環境可以通過 命令行 或 Anaconda Navigator 圖形界面實現。以下是詳細步驟: 方法1:通過命令行切換(推薦) 1. 查看所有虛擬環境 conda env list # 或 conda info --envs 輸出示例: base …

【vue】axios網絡請求介紹

一、基礎使用 1.引入js文件 2.在methods中的函數里寫 axios.get(路徑) .then((res))>{ console.log(res.data);//控制臺打印結果數據 this.listArrres.data//定義數組來接收返回來的數據 }) 二、參數傳遞 參數傳遞一般在路徑后面使用 params:{ num:2,…

機器學習 --- KNN算法

機器學習 — KNN算法 文章目錄 機器學習 --- KNN算法一,sklearn機器學習概述二,KNN算法---分類2.1樣本距離判斷2.2 KNN算法原理2.3 KNN缺點2.4 API2.5 使用sklearn中鳶尾花數據集實現KNN 一,sklearn機器學習概述 獲取數據、數據處理、特征工…

Spring Boot 中的重試機制

Retryable 注解簡介 Retryable 注解是 Spring Retry 模塊提供的,用于自動重試可能會失敗的方法。在微服務架構和分布式系統中,服務之間的調用可能會因為網絡問題、服務繁忙等原因失敗。使用 Retryable 可以提高應用的穩定性和容錯能力 1。 使用步驟 &…

FPGA生成隨機數的方法

FPGA生成隨機數的方法,目前有以下幾種: 1、震蕩采樣法 實現方式一:通過低頻時鐘作為D觸發器的時鐘輸入端,高頻時鐘作為D觸發器的數據輸入端,使用高頻采樣低頻,利用亞穩態輸出隨機數。 實現方式二:使用三個…

(五)毛子整潔架構(分布式日志/Redis緩存/OutBox Pattern)

文章目錄 項目地址一、結構化日志1.1 使用Serilog1. 安裝所需要的包2. 注冊服務和配置3. 安裝Seq服務 1.2 添加分布式id中間件1. 添加中間件2. 注冊服務3. 修改Application的LoggingBehavior 二、Redis緩存2.1 添加緩存1. 創建接口ICaching接口2. 實現ICaching接口3. 注冊Cachi…

Vue.js 全局導航守衛:深度解析與應用

在 Vue.js 開發中,導航守衛是一項極為重要的功能,它為開發者提供了對路由導航過程進行控制的能力。其中,全局導航守衛更是在整個應用的路由切換過程中發揮著關鍵作用。本文將深入探討全局導航守衛的分類、作用以及參數等方面內容。 一、全局…

使用FastAPI和React以及MongoDB構建全棧Web應用05 FastAPI快速入門

一、FastAPI概述 1.1 什么是FastAPI FastAPI is a modern, high-performance Python web framework designed for building APIs. It’s rapidly gaining popularity due to its ease of use, speed, and powerful features. Built on top of Starlette, FastAPI leverages a…

如何查看打開的 git bash 窗口是否是管理員權限打開

在 git bash 中輸入: net session >nul 2>&1 && (echo Ok) || (echo Failed) 顯示 OK 》是管理員權限; 顯示 Failed 》不是管理員權限。 如何刪除此步生成的垃圾文件: 新建一個 .txt 文件,輸入以下代碼…

得物0509面試手撕題目解答

題目 使用兩個棧(一個無序棧和一個空棧)將無序棧中的元素轉移到空棧,使其有序,不允許使用其他數據結構。 示例:輸入:[3, 1, 6, 4, 2, 5],輸出:[6, 5, 4, 3, 2, 1] 思路與代碼 如…

基于 Nexus 在 Dockerfile 配置 yum, conda, pip 倉庫的方法和參考

在 Nexus 配置代理倉庫的方法,可參考 pypi 的配置博客:https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式,參考官方文檔,如 pypi:https://help.sonatype.com/en/pypi-repositories.html 配置 yum…

[6-8] 編碼器接口測速 江協科技學習筆記(7個知識點)

1 2 在STM32微控制器的定時器模塊中,CNT通常指的是定時器的計數器值。以下是CNT是什么以及它的用途: 是什么: ? CNT:代表定時器的當前計數值。在STM32中,定時器從0開始計數,直到達到預設的自動重裝載值&am…

RabbitMQ ③-Spring使用RabbitMQ

Spring使用RabbitMQ 創建 Spring 項目后&#xff0c;引入依賴&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…

海外IP被誤封解決方案

這里使用Google Cloud和Cloudflare來實現&#xff0c;解決海外服務器被誤封IP&#xff0c;訪問不到的問題。 這段腳本的核心目的&#xff0c;是自動監測你在 Cloudflare 上管理的 VPS 域名是否可達&#xff0c;一旦發現域名無法 Ping 通&#xff0c;就會幫你更換IP&#xff1a…

一個基于 Spring Boot 的實現,用于代理百度 AI 的 OCR 接口

一個基于 Spring Boot 的實現&#xff0c;用于代理百度 AI 的 OCR 接口 BaiduAIController.javaBaiduAIConfig.java在 application.yml 或 application.properties 中添加配置&#xff1a;application.yml同時&#xff0c;需要在Spring Boot應用中配置RestTemplate&#xff1a;…

GPT-4o 遇強敵?英偉達 Eagle 2.5 視覺 AI 王者登場

前言&#xff1a; 在人工智能領域&#xff0c;視覺語言模型的競爭愈發激烈。GPT-4o 一直是該領域的佼佼者&#xff0c;但英偉達的 Eagle 2.5 橫空出世&#xff0c;憑借其 80 億參數的精簡架構&#xff0c;在長上下文多模態任務中表現出色&#xff0c;尤其是在視頻和高分辨率圖像…

將語言融入醫學視覺識別與推理:一項綜述|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Integrating language into medical visual recognition and reasoning: A survey 將語言融入醫學視覺識別與推理&#xff1a;一項綜述 01 文獻速遞介紹 檢測以及語義分割&#xff09;是無數定量疾病評估和治療規劃的基石&#xff08;利特延斯等人&#xff0c…

Ubuntu24.04版本解決RK3568編譯器 libmpfr.so.4: cannot open shared object

問題描述 在Ubuntu24.04版本上編譯RK3568應用程序關于libmpfr.so.4: cannot open shared object問題&#xff0c;如下所示&#xff1a; /tools/ToolsChain/rockchip/rockchip_rk3568/host/bin/../libexec/gcc/aarch64-buildroot-linux-gnu/9.3.0/cc1plus: error while loadin…

產線視覺檢測設備技術方案:基于EFISH-SCB-RK3588/SAIL-RK3588的國產化替代賽揚N100/N150全場景技術解析

一、核心硬件選型與替代優勢? ?1. 算力與AI加速能力? ?異構八核架構?&#xff1a;采用4Cortex-A76&#xff08;2.4GHz&#xff09;4Cortex-A55&#xff08;1.8GHz&#xff09;設計&#xff0c;支持視覺算法并行處理&#xff08;如模板匹配、缺陷分類&#xff09; 相機采…

python如何合并excel單元格

在Python中合并Excel單元格&#xff0c;常用openpyxl庫實現。以下是詳細步驟和示例代碼&#xff1a; 方法一&#xff1a;使用 openpyxl 庫 步驟說明&#xff1a; 安裝庫&#xff1a; pip install openpyxl導入庫并加載文件&#xff1a; from openpyxl import load_workbook# …