【JAVA】消息隊列(MQ)是個好東西

一、前言

? ? ?再JAVA系統開發中,再高并發的場景經常需要使用到消息隊列,有時候是不得不使用到消息對了。特別是大數據量的并發處理。對數據實時性要求又沒那么高的情況下。

用戶請求 → 接入層(Nginx) → 限流 → 消息隊列 → 訂單服務 → 庫存服務 → 支付服務
↑ ? ? ? ? ? ? ? ? ? ? ↓
結果緩存 ←───────────────┘

在高并發場景下,消息隊列(MQ)作為系統解耦、流量削峰和異步處理的核心組件,其性能優化和穩定性保障至關重要。下面我將從架構設計、性能優化、可靠性保障等方面詳細解析高并發場景下的MQ使用策略。

高并發場景下的MQ選型策略

1. 主流MQ性能對比

特性RabbitMQKafkaRocketMQPulsar
吞吐量萬級百萬級十萬級百萬級
延遲微秒級毫秒級毫秒級毫秒級
持久化支持支持支持支持
事務消息支持支持(0.11+)支持支持
高可用鏡像隊列分區復制主從復制分層存儲
適用場景業務解耦/復雜路由日志/流處理訂單/交易多租戶/流計算

2. 選型建議

  • 電商秒殺:RocketMQ(事務消息+高吞吐)

  • 日志收集:Kafka(超高吞吐+分區存儲)

  • 金融支付:RabbitMQ(強一致性+復雜路由)

  • 物聯網IoT:Pulsar(多租戶+低延遲)

二、MQ主要使用,一是數據產生,第二是消費

消息隊列(MQ)是分布式系統中常用的異步通信機制,Java中常用的MQ實現包括RabbitMQ、Apache Kafka、ActiveMQ、RocketMQ等。下面我將介紹這些MQ在Java中的基本使用方法。

三、直接上代碼示例

生產者:

/*** 消息隊列的生產者*/
package cn.xxx.module.member.mq.producer;
@Slf4j
@Component
public class MemberUserProducer {@Resourceprivate ApplicationContext applicationContext;/*** 發送 {@link MemberUserCreateMessage} 消息** @param userId 用戶編號*/public void sendUserCreateMessage(Long userId) {applicationContext.publishEvent(new MemberUserCreateMessage().setUserId(userId));}}

消費者:

/*** 消息隊列的消費者*/
package cn.xxx.module.member.mq.consumer;
@Slf4j
@Component
public class MemberRegisterPointIssueConsumer implements ApplicationRunner {@Resourceprivate RocketTXMqService rocketTXMqService;@Resourceprivate MemberPointIssueApi memberPointIssueApi;@Value("${rocketmq.producer2.topic}")private String memberRegisterPointIssueTopic;@Overridepublic void run(ApplicationArguments args) throws Exception {DefaultMQPushConsumer pushConsumer = rocketTXMqService.getPushConsumer2();if (null != pushConsumer) {try {pushConsumer.subscribe(memberRegisterPointIssueTopic, "*");// 注冊回調實現類來處理從broker拉取回來的消息pushConsumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {// 消息處理邏輯IssueRegisterTaskPointReqVO issueRegisterTaskPointReqVO = JSONObject.parseObject(msgs.get(0).getBody(), IssueRegisterTaskPointReqVO.class);log.info("%s Receive Topic %s New Messages: %s issueRegisterTaskPointReqVO: %s %n", Thread.currentThread().getName(), memberRegisterPointIssueTopic, msgs, JSONObject.toJSONString(issueRegisterTaskPointReqVO));memberPointIssueApi.issueRegisterTaskPoint(issueRegisterTaskPointReqVO);// 標記該消息已經被成功消費, 根據消費情況,返回處理狀態return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;});// 啟動消費者實例pushConsumer.start();log.info("push topic{} consumer start success", memberRegisterPointIssueTopic);} catch (MQClientException e) {log.error("push topic{} MQClientException:{}", memberRegisterPointIssueTopic, e.getMessage());}}}
}

可靠性保障機制

1. 消息不丟失設計

環節保障措施
生產者事務消息/confirm機制+本地消息表+定時任務補償
Broker同步刷盤+多副本同步復制(ISR)+ RAID磁盤陣列
消費者手動ACK+消費冪等設計+死信隊列+消息軌跡追蹤

?消息積壓處理方案

// 動態擴容消費者實例(Kafka示例)
// 1. 監控積壓量
long lag = getConsumerLag("order-topic", "consumer-group");
// 2. 自動擴容規則
if (lag > 100000) {  // 積壓超過10萬scaleConsumerInstances(2); // 雙倍擴容
} else if (lag < 1000) {scaleConsumerInstances(0.5); // 縮容50%
}// 3. 緊急處理方案
if (lag > 500000) {// 啟動降級處理服務startDegradeService();// 消息轉存至冷存儲transferToColdStorage();
}

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

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

相關文章

【Golang面試題】Go結構體的特點,與其它語言的區別

Go 結構體深度解析&#xff1a;與 C/C、Java 的全面對比 一、核心概念對比特性Go 結構體 (struct)C/C 結構體 (struct)Java 類 (class)本質值類型復合數據類型值類型復合數據類型引用類型內存分配棧或堆 (編譯器決定)棧 (顯式控制)堆 (JVM管理)默認訪問權限首字母大寫導出publi…

CppCon 2018 學習:OOP is dead, long live Data-oriented design

探討了面向對象編程&#xff08;OOP&#xff09;的一些根本性問題深入理解&#xff1a; 標題&#xff1a;What is so wrong with OOP? 什么是面向對象的問題&#xff1f; 這不是說 OOP “絕對錯誤”&#xff0c;而是指出它在實踐中經常引發的問題&#xff0c;尤其是在性能敏…

科學的第五范式:人工智能如何重塑發現之疆

在人類探索未知的壯闊史詩中&#xff0c;科學方法的演進如同照亮迷霧的燈塔。從基于經驗的第一范式&#xff08;描述自然現象&#xff09;&#xff0c;到以理論推演為核心的第二范式&#xff08;牛頓定律、麥克斯韋方程&#xff09;&#xff0c;再到以計算機模擬為標志的第三范…

tmux 左下角會話名顯示不全的解決方法

在 tmux 中顯示完整的會話名 有時候我們要在服務器上長時間跑某個任務&#xff0c;但不可能時時刻刻保持終端模擬器開啟&#xff0c;這時候就需要用到 tmux &#xff0c;可以在關閉會話的同時讓任務繼續在后臺跑&#xff0c;后續還可以連回來。但在 tmux 會話中&#xff0c;左…

【期末分布式】分布式的期末考試資料大題整理

&#x1f9f8;安清h&#xff1a;個人主頁 &#x1f3a5;個人專欄&#xff1a;【Spring篇】【計算機網絡】【Mybatis篇】 &#x1f3af;大題 ?一.Nacos的服務注冊與發現 &#x1f6a6;1.怎么來進行服務的注冊與發現的這樣的一個流程&#xff0c;描述一下。 &#x1f383;描述…

Android手機無網離線使用FunASR識別麥克風語音內容

手機斷網離線使用FunASR識別麥克風語音內容 --本地AI電話機器人 上一篇&#xff1a;阿里FunASR本地斷網離線識別模型簡析 下一篇&#xff1a;手機無網離線使用FunASR識別手機歷史通話錄音 一、前言 繼上一篇《阿里FunASR本地斷網離線識別模型簡析》和前面幾篇ASR相關理論的…

Stable Diffusion 項目實戰落地:從0到1 掌握ControlNet 第五篇 線稿到高清修復:一步步教你用AI做出完美IP形象

大家好!上一篇,我們一起玩轉了字體風格變換 ,讓文字根據提示詞進行自如變換,個性十足又充滿創意! 如果你錯過了那篇文章,別擔心,趕緊點這里補課:Stable Diffusion 項目實戰落地:從0到1 掌握ControlNet 第四篇 風格化字體大揭秘:從線稿到涂鴉,ControlNet讓文字煥發新生…

Java網絡編程:TCP/UDP套接字通信詳解

TCP客戶端套接字創建與使用 Socket類基礎概念 Socket類的對象代表TCP客戶端套接字&#xff0c;用于與TCP服務器套接字進行通信。與服務器端通過accept()方法獲取Socket對象不同&#xff0c;客戶端需要主動執行三個關鍵步驟&#xff1a;創建套接字、綁定地址和建立連接。 客戶端…

VMware vSphere 9與ESXi 9正式發布:云原生與AI驅動的虛擬化平臺革新

2025年6月18日&#xff0c;VMware正式推出其旗艦虛擬化平臺vSphere 9及配套的ESXi 9操作系統&#xff0c;標志著企業級虛擬化技術邁入以云原生、人工智能&#xff08;AI&#xff09;和硬件加速為核心的新紀元。此次更新不僅在功能層面實現突破&#xff0c;更通過授權模式革新為…

汽車功能安全概念階段開發【相關項定義HARA】2

文章目錄 1 淺談概念階段開發2 功能安全概念階段開發2.1 相關項定義2.2 危害分析與風險評估&#xff08;HARA-Hazard Analysis and Risk Assessment&#xff09; 3 關鍵輸出與對后續階段的影響4 總結 1 淺談概念階段開發 概念階段開發是整個研發流程的起點和基石。它發生在任何…

WPF中依賴屬性和附加屬性

依賴屬性&#xff08;DependencyProperty&#xff09; 依賴屬性是WPF中的一種特殊屬性&#xff0c;它的實現依賴于DependencyObject類提供的基礎設施。與普通的.NET屬性不同&#xff0c;依賴屬性的值可以通過多種方式確定&#xff0c;包括繼承、樣式、數據綁定和動畫等。 主要特…

Docker 中如何實現鏡像的推送和拉取

在 Docker 中&#xff0c;鏡像的推送&#xff08;push&#xff09;和拉取&#xff08;pull&#xff09;是通過與**Docker 鏡像倉庫&#xff08;Registry&#xff09;**交互完成的。默認倉庫是 Docker Hub&#xff0c;但你也可以使用私有倉庫&#xff08;Harbor、Nexus、AWS ECR…

[C#] WPF - 自定義樣式(Slider篇)

一、定義樣式 在App.xaml里面定義樣式&#xff1a; <Applicationx:Class"WpfApp.StudySlider.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local&q…

eBPF 實戰指南:精準定位 TCP 重傳,洞察網絡瓶頸真相

更多云服務器知識&#xff0c;盡在hostol.com 你有沒有遇到過這種情況&#xff1f;網站訪問卡頓&#xff0c;接口響應慢得像蝸牛爬。你 ping 服務器沒丟包&#xff0c;CPU 內存也沒打滿&#xff0c;日志也沒報錯&#xff0c;結果就是不知道哪兒出的問題。 你用抓包分析&#x…

在 Ubuntu 系統上安裝 Docker 環境

在當今的開發環境中&#xff0c;Docker 已經成為容器化技術的主流選擇。它可以幫助開發者輕松地創建、部署和運行應用程序。本文將詳細介紹如何在 Ubuntu 系統上安裝 Docker 和 Docker Compose&#xff0c;并解決在安裝過程中可能遇到的一些常見問題。 一、安裝 Docker 1.卸載舊…

【Qt】QxORM無法刪除和更改主鍵值為0的行,否則報錯:invalid primary key

1、問題描述 使用 QxORM 刪除或者更改數據庫時,當主鍵值為 0 時,報錯: [QxOrm] invalid primary key2、原因分析 2.1 源碼分析 查找打印錯誤提示的代碼: #define QX_DAO_ERR_INVALID_PRIMARY_KEY "[QxOrm] invalid primary key" QSqlError IxDao_Help…

數學建模_線性規劃

問題背景模型介紹matlab求解 示例 問題背景 模型介紹 matlab求解 max問題轉化為min問題 > > >號轉化為 < < <號 示例 看到多個線性規劃目標 2個目標函數變成1個目標函數 后面省略

51單片機制作萬年歷

硬件設計 主控芯片&#xff1a;一般選用AT89C52單片機&#xff0c;它與MCS - 51單片機產品兼容&#xff0c;有8K字節在系統可編程Flash存儲器、32個可編程I/O口線、三個16位定時器 / 計數器等。時鐘芯片&#xff1a;常用DS1302時鐘芯片&#xff0c;能提供實時時鐘 / 日歷、定時…

Oracle CTE遞歸實現PCB行業的疊層關系

1、需求背景&#xff0c;出貨報告要實現疊板假層的處理&#xff0c;需求如下 表ID,layer,MEDIUM數據如下 第一種情況&#xff0c;layer有K的 IDlayerMEDIUM1L1-L2302L2-L3403L3-K1204K1-L4105L4-L5206L5-L6307L7-K2108K2-L8119L8-L91010L9-L1030 實現layer有K1的&#xff0c…

Kubernetes 服務發布基礎學習

一、Service 概述&#xff08;一&#xff09;Service 的定義Service 是 Kubernetes 中的一種抽象概念&#xff0c;用于定義一組 Pod 以及訪問這組 Pod 的策略。其核心作用是將一組 Pod 封裝為一個虛擬服務&#xff0c;并為客戶端提供統一的入口&#xff0c;從而實現服務的負載均…