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