前言
RocketMQ中的简单消息主要包括同步消息、异步消息和单向消息三种类型,它们各自具有不同的特点和适用场景。今天这篇文章主要介绍RocketMQ简单消息的三种类型,并做实例演示。
希望这篇文章能帮助到正在学习RocketMQ知识点的小伙伴儿们!!!
同步消息
同步消息是RocketMQ中最基础的消息发送模式。在发送消息时,生产者会阻塞等待,直到收到Broker的确认消息或达到超时时间。这种机制可以确保消息的可靠传输,生产者能够确切地知道消息是否已被Broker成功接收并存储。
按照前几篇文章那样,开启之前的三台RocketMQ集群,运行以下代码(流程注释已经标出):
public class SyncProducer {
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
// 创建DefaultMQProducer实例,并指定生产者的组名,这个组名用于区分不同的生产者
DefaultMQProducer producer = new DefaultMQProducer("producerGroup1");
// 设置NameServer的地址,NameServer运行在192.168.220.135的9876端口上
producer.setNamesrvAddr("192.168.220.135:9876");
// 启动生产者实例
producer.start();
// 循环发送100条消息
for (int i = 0; i < 100; i++) {
// 创建Message实例,封装要发送的消息。主题(Topic)、标签(Tag)、消息体(需要是字节数组)
Message msg = new Message("TopicTest" /* Topic:指定消息发送到的主题 */,
"TagA" /* Tag:用于消息过滤的标签,消费者可以根据标签过滤需要消费的消息 */,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body:消息体,这里是将字符串转换为字节数组 */
);
// 同步发送消息,send方法会阻塞直到消息发送完成或发生异常
SendResult sendResult = producer.send(msg);
// 打印发送结果,SendResult包含了消息发送的详细结果,如消息ID等
System.out.printf("%s%n", sendResult);
}
System.out.println("同步方式发送消息");
// 关闭生产者实例,释放资源
producer.shutdown();
}
}
因为是同步消息,在发送消息的过程中生产者会阻塞,所以是先发送消息,然后输出的同步方式发送消息:
同步方式发送消息的适用场景
需要确保消息的可靠性和一致性,并且对消息发送的响应时间要求不高的场景。
异步消息
异步消息在发送时不会阻塞生产者线程,生产者可以继续执行其他任务。当Broker接收到消息并处理完毕后,会通过回调函数的方式通知生产者发送结果。这种机制可以提高消息发送的效率,同时也能保持消息的可靠性。
同上,异步消息的发送流程如下(代码注释标出):
public class AsyncProducer {
public static void main(String[] args) throws Exception {
// 创建一个DefaultMQProducer实例,指定一个唯一的生产者组名
DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
// 设置NameServer的地址,NameServer运行在192.168.220.135的9876端口上
producer.setNamesrvAddr("192.168.220.135:9876");
//设置为0,异步发送失败后不进行重试
producer.setRetryTimesWhenSendAsyncFailed(0);
// 启动生产者实例
producer.start();
int messageCount = 100;
// 使用CountDownLatch来等待所有异步消息发送完成
final CountDownLatch countDownLatch = new CountDownLatch(messageCount);
for (int i = 0; i < messageCount; i++) {
try {
final int index = i;
// 创建Message实例,设置主题、标签、消息体
Message msg = new Message("Jodie_topic_1023",
"TagA",
"OrderID188",
"Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
// 异步发送消息,设置发送成功和发送失败的回调函数
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
countDownLatch.countDown();
// 打印发送成功的消息ID和索引
System.out.printf("%-10d OK %s %n", index, sendResult.getMsgId());
}
@Override
public void onException(Throwable e) {
countDownLatch.countDown();
// 打印发送失败的索引和异常信息
System.out.printf("%-10d Exception %s %n", index, e);
e.printStackTrace();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("======异步方式发送消息=======");
countDownLatch.await(5, TimeUnit.SECONDS);
// 关闭生产者实例
producer.shutdown();
}
}
异步方式生产者在发送消息时不会阻塞,所以先打印的输出,然后再发送消息,结果如下:
异步方式适用场景
消息发送效率要求较高,并且需要保证消息可靠性的场景。比如,在电商平台的商品推荐系统中,系统需要实时地向用户推送个性化的商品信息。由于用户量巨大且实时性要求较高,使用异步消息可以提高系统的响应速度和吞吐量。
单向消息(Oneway Message)
单向消息是RocketMQ中最轻量级的消息发送模式。生产者发送消息后,不会等待Broker的响应,也不会关心消息是否发送成功。这种机制提高了消息发送的效率,但是牺牲了消息的可靠性。
单向消息发送流程(同上):
public class OnewayProducer {
public static void main(String[] args) throws Exception {
DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
producer.setNamesrvAddr("192.168.220.135:9876");
producer.start();
for (int i = 0; i < 100; i++) {
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " +
i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
producer.sendOneway(msg);
}
System.out.println("------------单向方式发送消息成功------------");
Thread.sleep(5000);
producer.shutdown();
}
}
运行结果如下:
单向信息适用场景
日志收集:当需要将大量的日志数据发送到RocketMQ服务器,并不关心消费者是否成功消费时。
通知消息:当消息的可靠性要求较低,仅仅需要通知消费者执行某些操作时。 监控告警:当需要发送监控告警信息给相关人员,不需要获得发送结果时。
文章小结
RocketMQ中的简单消息包括同步消息、异步消息和单向消息三种类型。它们各自具有不同的特点和适用场景,我们可以根据实际业务需求选择合适的消息类型进行消息传输。
同时,RocketMQ还提供了丰富的消息过滤、消息重试、消息回溯等等高级功能,这个我们后面继续聊!
本篇文章到这里就结束了,后续会继续分享RocketMQ相关的知识,感谢各位小伙伴们的支持!