一、概述
1.批量发送消息:
批量发送消息能显著提高传递小消息的性能
。限制
是这些批量消息应该有相同的 topic,相同的 waitStoreMsgOK,而且不能是延时消息。此外,这一批消息的总大小不应超过 4MB。
2.批量接收消息:
批量接收消息能提高传递小消息的性能,同时与顺序消息
配合的情况下,还能根据业务主键对顺序消息进行去重(是否可去重,需要业务来决定),减少消费者对消息的处理
3.批量消息使用场景
如果消息过多,每次发送消息都和MQ建立连接,无疑是一种性能开销,批量消息可以把消息打包批量发送,批量发送消息能显著提高传递小消息的性能。
4.批量消息限制
批量发送消息能显著提高传递消息的性能。限制是这些批量消息应该有相同的topic,而且不能是延时消息
。此外,这一批消息的总大小不应超过4MB
,
如果超过可以有2种处理方案:
1.将消息进行切割成多个小于4M的内容进行发送
2.修改4M的限制改成更大
可以设置Producer的
maxMessageSize
属性
修改配置文件中的maxMessageSize
属性
对于消费者而言Consumer的MessageListenerConcurrently
监听接口的consumeMessage()方法的第一个参数为消息列 表,但默认情况下每次只能消费一条消息
,可以通过:Consumer的pullBatchSize属性设置消息拉取数量(默认32),可以通过设置consumeMessageBatchMaxSize
属性设置消息一次消费数量(默认1)。
[注意]:pullBatchSize 和 consumeMessageBatchMaxSize并不是设置越大越好,一次拉取数据量太大会导致长时间等待,性能降低。而且消息处理失败同一批消息都会失败,然后进行重试,导致消费时长增加。增加没必要的重试次数
二、应用
1.创建Springboot项目,添加rockermq 依赖
<!--rocketMq依赖-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
2.配置rocketmq
# 端口
server:
port: 8083
# 配置 rocketmq
rocketmq:
name-server: 127.0.0.1:9876
#生产者
producer:
#生产者组名,规定在一个应用里面必须唯一
group: group1
#消息发送的超时时间 默认3000ms
send-message-timeout: 3000
#消息达到4096字节的时候,消息就会被压缩。默认 4096
compress-message-body-threshold: 4096
#最大的消息限制,默认为128K
max-message-size: 4194304
#同步消息发送失败重试次数
retry-times-when-send-failed: 3
#在内部发送失败时是否重试其他代理,这个参数在有多个broker时才生效
retry-next-server: true
#异步消息发送失败重试的次数
retry-times-when-send-async-failed: 3
3.创建生产者 发送批量消息—小于4MB
发送批量消息,最主要的区别是在发送消息的send方法入参一个List。
package com.example.springbootrocketdemo.controller;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 批量消息
* @author qzz
*/
@RestController
public class RocketMQBatchController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* 发送批量消息
* 发送批量消息,最主要的区别是在发送消息的send方法入参一个List。
*/
@RequestMapping("/testBatchSend")
public void testSyncSend(){
List<Message<String>> messageList = new ArrayList<>();
for(int i=0;i<10;i++){