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