目錄
- 引言
- 問題分析
- RocketMq順序訊息
- 生產者
- 消費者
- 消費結果
- 小結
引言
總有那么一種業務需求是要有先后順序來執行
問題分析
例:在A系統下了一個訂單,需要推到B系統去生成訂單和發貨單,并且是要先生成訂單再生成發貨單,如果按正常情況去先發造成訂單的訊息到MQ,再發生成發貨單的訊息到MQ會出現的幾種問題;
-
推送訂單和推送發貨單的訊息發到不同的主題?
如果放到不同的主題,每個消費者對不同的主題的消費速度是不一樣的,即使是先發訂單訊息再發發貨單訊息也是保證不了順序性的, -
推送訂單和推送發貨單的訊息發到同一個主題?
同一個主題又有多個佇列,多個佇列又有多個不同的消費者來消費,所以正常情況下也是保證不一順序性的, -
解決方案
同一個訂單以及他的發貨單發到同一個主題的同一個佇列,消費者會固定消費一個主題的一個佇列或多個佇列的訊息,在訊息消費時再根據標識來判斷推訂單介面或發貨單介面,這樣就保證了消費的順序性,
RocketMq順序訊息
生產者
/**
* 順序訊息
*/
@Test
public void demo2() {
for (int i = 0; i < 10; i++) {
String key = String.valueOf(i % rocketMQTemplate.getProducer().getDefaultTopicQueueNums());
String msg = "訂單 " + i + " " + IdUtil.getSnowflake(1, 1).nextId();
rocketMQTemplate.syncSendOrderly("topic-C", msg, key);
msg = "發貨單 " + i + " " + IdUtil.getSnowflake(1, 1).nextId();
rocketMQTemplate.syncSendOrderly("topic-C", msg, key);
}
}
消費者
package com.lik.listener;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RocketMQMessageListener(consumerGroup = "consumer-group-4", topic = "topic-C")
public class TestConsumer7 implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
log.info("消費者7: " + message);
}
}
@Slf4j
@Component
@RocketMQMessageListener(consumerGroup = "consumer-group-4", topic = "topic-C")
public class TestConsumer8 implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
log.info("消費者8: " + message);
}
}
消費結果


小結
從上圖可看出訂單和發貨單都是順序消費的,重點在于生產者syncSendOrderly方法和主題,以及第3個引數,同一類的訊息發到同一個佇列,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421431.html
標籤:其他
上一篇:北匯資訊正式加入IAMTS聯盟,助力智能網聯汽車事業發展
下一篇:02環境搭建
