rocketmq queue_RocketMQ 实战(三) - 消息的有序性
■ RocketMQ有序消息的使用
1 為什么需要消息的有序性
比如用戶張三終于掙了一百存在在銀行卡里存取款,對應(yīng)兩個異步的短信消息,肯定要保證先存后取吧,不然都沒錢怎么發(fā)了取錢的消息呢! M1 - 存錢 M2 - 取錢
而mq默認(rèn)發(fā)消息到不同q顯然是行不通的,會亂序 需要發(fā)往同一個q,先進(jìn)先出
2 有序消息的基本概念
有序消息又叫順序消息(FIFO 消息) 是指消息的消費(fèi)順序和產(chǎn)生順序相同,在有些業(yè)務(wù)邏輯下,必須保證順序。
比如訂單的生成、付款、發(fā)貨,這個消息必須按順序處理才行。 順序消息分為全局順序和分區(qū)(queue)順序
2.1 全局順序
概念
一個Topic內(nèi)所有的消息都發(fā)布到同一個queue,按照先進(jìn)先出的順序進(jìn)行發(fā)布和消費(fèi)
適用場景
性能要求不高,所有的消息嚴(yán)格按照FIFO原則進(jìn)行消息發(fā)布和消費(fèi)的場景
2.2 分區(qū)順序
概念
對于指定的一個Topic,所有消息根據(jù)sharding key進(jìn)行區(qū)塊(queue)分區(qū)
同一個queue內(nèi)的消息按照嚴(yán)格的FIFO順序進(jìn)行發(fā)布和消費(fèi)
Sharding key是順序消息中用來區(qū)分不同分區(qū)的關(guān)鍵字段,和普通消息的 Key是完全不同的概念
適用場景
性能要求高,根據(jù)消息中的sharding key去決定消息發(fā)送到哪-個queue
2.3 全局順序與分區(qū)順序?qū)Ρ?/h2>
發(fā)發(fā)送方式對比
3 如何保證消息順序
在MQ的模型中,順序需要由3個階段去保障
4 RocketMQ 的有序消息實現(xiàn)原理
RocketMQ消費(fèi)端有兩種類型:
- MQPullConsumer
- MQPushConsumer
底層都是通過pull機(jī)制去實現(xiàn),pushConsumer是一種API封裝
MQPullConsumer 由用戶控制線程,主動從服務(wù)端獲取消息,每次獲取到的是一個MessageQueue中的消息。
PullResult中的 List<MessageExt> msgFoundList自然和存儲順序一致,用戶需要再拿到這批消息后自己保證消費(fèi)的順序。
MQPushConsumer由用戶注冊MessageListener來消費(fèi)消息,在客戶端中需要保證調(diào)用MessageListener時消息的順序性
看源碼
- 拉取生產(chǎn)端消息
- 判斷是并發(fā)的還是有序的,對應(yīng)不同服務(wù)實現(xiàn)類
5 有序消息的缺陷
發(fā)送順序消息無法利用集群的Failover特性,因為不能更換MessageQueue進(jìn)行重試
因為發(fā)送的路由策略導(dǎo)致的熱點(diǎn)問題,可能某一些MessageQueue的數(shù)據(jù) 量特別大 ◆ 消費(fèi)的并行讀依賴于queue數(shù)量 ◆ 消費(fèi)失敗時無法跳過
6 使用
見官網(wǎng)Order-example
總結(jié)
以上是生活随笔為你收集整理的rocketmq queue_RocketMQ 实战(三) - 消息的有序性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十九、MySQL常用命令总结
- 下一篇: ad19pcb设置恢复默认_条码打印机-