这篇给大家讲普通消息和批量消息,主要配合代码进行讲解,关于RocketMQ的基础知识已经在上篇给大家讲过需要回顾的点击下面这个链接去看
普通消息其实就很简单,是Apache RocketMQ中最基础的消息形式,区别于有特性的顺序消息、定时/延时消息和事务消息。普通消息一般应用于微服务解耦、事件驱动、数据集成等场景,这些场景大多数要求数据传输通道具有可靠传输的能力,且对消息的处理时机、处理顺序没有特别要求。
在电商交易场景中,上游订单系统将用户下单支付这一业务事件封装成独立的普通消息并发送至RocketMQ服务端,下游按需从服务端订阅消息并按照本地消费逻辑处理下游任务。每个消息之间都是相互独立的,且不需要产生关联。
在离线的日志收集场景中,通过埋点组件收集前端应用的相关操作日志,并转发到RocketMQ。每条消息都是一段日志数据,RocketMQ不做任何处理,只需要将日志数据可靠投递到下游的存储系统和分析系统即可,后续功能由后端应用完成。
普通消息是RocketMQ基本消息功能,支持生产者和消费者的异步解耦通信。
例如下面这个代码就是普通消息:
public class Producer {
public static void main(String[] args) throws Exception {
//创建一个生产者,指定生产者组为 sanyouProducer
DefaultMQProducer producer = new DefaultMQProducer("sanyouProducer");
// 指定NameServer的地址
producer.setNamesrvAddr("192.168.200.143:9876");
// 启动生产者
producer.start();
//创建一条消息 topic为 sanyouTopic 消息内容为 java日记
Message msg = new Message("sanyouTopic", "java日记".getBytes(RemotingHelper.DEFAULT_CHARSET));
// 发送消息并得到消息的发送结果,然后打印
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
// 关闭生产者
producer.shutdown();
}
}
构建的消息的topic为sanyouTopic
,内容为java日记
,这就是一条很普通的消息
MQ的批量消息是指将多条小的消息合并成一个批量消息,然后一次发送出去。
这种批量发送的好处是可以减少网络IO,提升吞吐量。在实际使用时,一个批次消息的大小不应超过1MB,但实际的最大限制是4194304字节,大概4MB。
同时,批量消息的使用也有一定限制,这些消息应该有相同的Topic,相同的waitStoreMsgOK。而且不能是延迟消息、事务消息等。
通俗易懂说就是将多个消息同时发过去,减少网络请求的次数
public class Producer {
public static void main(String[] args) throws Exception {
//创建一个生产者,指定生产者组为 sanyouProducer
DefaultMQProducer producer = new DefaultMQProducer("sanyouProducer");
// 指定NameServer的地址
producer.setNamesrvAddr("192.168.1.135:9876");
// 启动生产者
producer.start();
//用以及集合保存多个消息
List<Message> messages = new ArrayList<>();
messages.add(new Message("sanyouTopic", "java日记 0".getBytes()));
messages.add(new Message("sanyouTopic", "java日记 1".getBytes()));
messages.add(new Message("sanyouTopic", "java日记 2".getBytes()));
// 发送消息并得到消息的发送结果,然后打印
SendResult sendResult = producer.send(messages);
System.out.printf("%s%n", sendResult);
// 关闭生产者
producer.shutdown();
}
}
多个普通消息同时发送,这就是批量消息
不过在使用批量消息的时候,需要注意以下两点
每条消息的Topic必须都得是一样的
不支持延迟消息和事务消息
普通消息和批量消息比较简单,没有复杂的逻辑,就是将消息发送过去,在ConsumeQueue和CommitLog存上对应的数据就可以了。
关于文章中大家有任何疑问可以通过关注公众号《编程乐学》进行留言,同时,公众号还有更多有趣的项目以及关于学习编程的笔记资料大家可以看看,欢迎大家进行留言。