1. 概览
RocketMQ 早已提供了一组最佳实践,但工作在一线的伙伴却很少知道,项目中的各种随性代码经常导致消息错乱问题,严重影响业务的准确性。为了保障最佳实践的落地,降低一线伙伴的使用成本,统一 MQ 使用规范,需要对其进行抽象和封装…
1.1. 背景
RocketMQ的最佳实践中推荐:一个应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用自由设置。
在使用rocketMQTemplate发送消息时,通过设置发送方法的destination参数来设置消息的目的地,destination的格式为topicName:tagName,:前面表示topic的名称,后面表示tags名称,简单示例如下:
// 计算 destination
protected String createDestination(String topic, String tag) {
if (org.apache.commons.lang3.StringUtils.isNotEmpty(tag)){
return topic + ":" + tag;
}else {
return topic;
}
}
// 发送信息
String destination = createDestination(topic, tag);
SendResult sendResult = this.rocketMQTemplate.syncSendOrderly(destination, msg, shardingKey, 2000);
tags从命名来看像是一个复数,但发送消息时,目的地只能指定一个topic下的一个tag,不能指定多个。
但,在消费消息时,就变的没那么方便了,简单示例如下:
@Service
@RocketMQMessageListener(
topic = "consumer-test-topic-1",
consumerGroup ="user-message-consumer-1",
selectorExpression = "*",
consumeMode = ConsumeMode.ORDERLY
)
@Slf4j
public class RocketBasedUserMessageConsumer extends UserMessageConsumer
implements RocketMQListener<MessageExt> {
@Override
public void onMessage(MessageExt message) {
String tag = message.getTags();
byte[] body = message.getBody();
log.info("handle msg body {}", new String(body));
switch (tag){
case "UserCreatedEvent":
UserEvents.UserCreatedEvent createdEvent = JSON.parseObject(body, UserEvents.UserCreatedEvent.class);
handle(createdEvent);
return;
case "UserEnableEvent":
UserEvents.UserEnableEvent enableEvent = JSON.parseObject(body, UserEvents.UserEnableEvent.class);
handle(enableEvent);
return;
case "UserDisableEvent":
UserEvents.UserDisableEvent disableEvent = JSON.parseObject(body, UserEvents.UserDisableEvent.class);
handle(disableEvent);
&nb