RocketMQ中的三种简单消息类型详解,看完包会!

前言

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相关的知识,感谢各位小伙伴们的支持!

在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小威要向诸佬学习呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值