RocketMQ消息类型的顺序类型探究
2024-01-04 17:34:30
RocketMQ作为阿里系的一款分布式消息中间件,在分布式系统中发挥着不可或缺的作用。它的消息类型包含可靠消息、顺序消息、事务消息、延迟消息、过滤消息这几种类型。
本文着重讲解顺序消息。
RocketMQ的顺序消息,保证同一生产者生产消息的顺序,会被相同的消费者消费。这样通过这种特性,可以保证在消息积压的情况下,不会因为乱序导致消费失败。
1. RocketMQ的顺序消息类型
在RocketMQ-Spring-Boot-Starter中,分别提供了顺序同步,顺序异步,顺序单向的方式,这里重点讲解顺序同步。
顺序同步消息:发送顺序同步消息时,消息在发送完成后,会立即获得发送状态,无论是成功还是失败,都会返回结果。
顺序异步消息:异步发送顺序消息,无需等待发送结果,效率更高。但是一旦出现异常,会丢失发送状态。
顺序单向消息:发送顺序单向消息,RocketMQ仅提供发送服务,不保证结果。
2. 利用RocketMQ-Spring-Boot-Starter发送顺序消息
RocketMQ-Spring-Boot-Starter 是 RocketMQ 官方发布用于简化在 Spring Boot 环境下使用 RocketMQ 的 SDK。下面介绍如何利用它发送顺序消息。
pom.xml
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.5</version>
</dependency>
配置文件
rocketmq:
producer:
group: TEST_GROUP
namesrvAddr: 127.0.0.1:9876
consumer:
group: TEST_GROUP_CONSUMER
namesrvAddr: 127.0.0.1:9876
Java代码
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendOrderlyMessage(String topic, String tag, String message) {
MessageBuilder messageBuilder = MessageBuilder.withTopic(topic)
.withTags(tag)
.withKeys(UUID.randomUUID().toString())
.withBody(message.getBytes(StandardCharsets.UTF_8));
rocketMQTemplate.syncSendOrderly(topic, messageBuilder.build());
}
3. 注意事项
在使用顺序消息时需要注意以下几点:
- 发送顺序消息时,需要指定一个 MessageKey,该 MessageKey 必须保证在同一个 Producer 内的唯一性。
- 顺序消息只能在同一个 Consumer Group 内保证顺序,如果同一个 Topic 被多个 Consumer Group 消费,那么顺序将无法保证。
- 顺序消息的性能比普通消息要低,因此需要根据实际业务情况选择是否使用顺序消息。
4. 总结
顺序消息是 RocketMQ 提供的一种保证消息顺序发送和消费的消息类型。顺序消息的发送方式分为同步、异步和单向三种。同步发送方式是顺序发送消息时,消息在发送完成后,会立即获得发送状态,无论是成功还是失败,都会返回结果。异步发送方式无需等待发送结果,效率更高。但是一旦出现异常,会丢失发送状态。单向发送方式是 RocketMQ 仅提供发送服务,不保证结果。顺序消息可以保证在同一个 Consumer Group 内保持消息的顺序。在使用顺序消息时,需要指定一个 MessageKey,该 MessageKey 必须保证在同一个 Producer 内的唯一性。顺序消息只能在同一个 Consumer Group 内保证顺序,如果同一个 Topic 被多个 Consumer Group 消费,那么顺序将无法保证。顺序消息的性能比普通消息要低,因此需要根据实际业务情况选择是否使用顺序消息。