RabbitMQ高併發下的應用場景

RabbitMQ是目前非常熱門的一款消息中間件,不管是互聯網大廠還是中小企業都在大量使用。作爲一名合格的開發者,有必要對RabbitMQ有所瞭解,RabbitMQ是什麼、RabbitMQ核心概念、常用交換器類型、RabbitMQ服務器安裝等基礎,這裏就不重複講解了。這裏主要介紹一下MQ的應用場景和SpringBoot整合RabbitMQ的快速開發

MQ典型應用場景
RabbitMQ特點
消費端冪等性保障
生產端可靠性投遞

MQ典型應用場景

1.解耦。生產者不會關心消費者做了什麼,降低服務或者系統之間的耦合
2.流量削峯。下游服務根據自己的處理能力,每隔一定時間,或者每次拉取若干條消息,實施流控,達到保護自身的效果
3.異步處理。一個系統接收一個請求,需要在本地寫庫,還需要在另外幾個相關的系統寫庫都需要一定的時長。利用mq,本地處理完,發送消息到用mq後,直接響應。

RabbitMQ特點

RabbitMQ特點:
開源、性能優秀,穩定性保障
提供可靠性消息投遞模式、確認模式
與Spring AMQP完美整合,API豐富
集羣模式豐富,表達式配置,HA模式,鏡像隊列模型
保證數據不丟失的前提做到高可靠性、可用性

消費端冪等性保障

執行某個操作,無論執行多少次,結果都是一致的,就說具有冪等性。

如何避免重複消費
在海量訂單產生的業務高峯期,如何避免消息的重複消費?

消費端實現冪等性,然後永遠不會消費多次,即使收到多條一樣的消息

目前主流解決方案
指紋碼(就是時間戳 + 業務的一些規則, 來保證id + 指紋碼在同一時刻是唯一的,不會出現重複)

唯一ID + 指紋碼機制,利用數據庫主鍵去重;
select count(1) from t_order where id = 唯一ID + 指紋碼;
好處:實現簡單;
壞處:高併發下有數據庫寫入的瓶頸;
解決方案:跟進ID進行分庫分表進行算法路由;

利用Redis的原子性實現

通過setnx等命令 SET 訂單號 時間戳 過期時間

SET 1893505609317740 1466849127 EX 300 NX

生產端可靠性投遞

在這裏插入圖片描述

例如 UpstramService爲訂單服務,DownstreamServcie爲庫存服務
step1 訂單服務接收到一條訂單請求,處理相應業務後,發送消息到mq服務器,進行庫存校驗。
step2 過一段時間 ,會發送一條延時消息進行消息確認
step3 訂單服務監聽到step1的消息後就行庫存校驗,然後發送庫存確認消息step4
step5 callback服務監聽到庫存服務的確認信息後,本地落庫,記錄狀態。
step6 監聽到訂單服務的延時請求,進行本地消息的確認,
然後callback服務通過rpc遠程調用,通知訂單服務,訂單服務本地落庫,

springboot整合RabbitMQ的Starter,包含服務端和消費端,已上傳github
https://github.com/zhangjingchu/rabbitmq-quick-starter

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章