rocketMQ的pullBatchSize设置无效

446 阅读3分钟

rocketMQ的pullBatchSize设置无效

rocketMQ的pullBatchSize设置无效

背景

为甲方做了一个功能,用到了RocketMQ,在测试的时候,遇到了消息堆积

1,检查消费者一次拉取多少消息量

defaultMQPushConsumer.setPullInterval(1000 * 2);//设置拉取消息间隔,单位毫秒
defaultMQPushConsumer.setConsumeThreadMin(2);//最小消费线程数
defaultMQPushConsumer.setConsumeThreadMax(10);//最大消费线程数
defaultMQPushConsumer.setConsumeMessageBatchMaxSize(300);//消费者单次批量消费的消息数目上限,即List<MessageExt> 的最大size
defaultMQPushConsumer.setPullBatchSize(200);//每个队列每次拉取的最大消费数

2,再观察日志,发现即使设置每次最大200条消息,但是在日志中,发现每次都拉取的消息量不超过32条,且间隔两秒

消息处理完成,处理量8,耗时950毫秒

3,上游数据量过多,每次拉取消息不超过32,间隔两秒,如果消费逻辑耗时一般,时间久了,就会产生消息堆积

4,查阅资料,pullBatchSize的大小受制于broker配置文件中 maxTransferCountOnMessageInMemory 参数的设置,该参数默认设置为 32,也即是每次从服务端拉取的最大的数量不能超过32,因此即使设置 pullBatchSize超过32,最后也只返回32。因此,若要每次拉取的消息量超过32,可以修改broker配置文件里该参数的值,并重启broker服务。

consumeMessageBatchMaxSize <= pullBatchSize <= maxTransferCountOnMessageInMemory 。

5,也就是说,需要更改配置客户端的 maxTransferCountOnMessageInMemory 的值

6,配置的位置位于 rocketmq-all-4.9.8-bin-release\rocketmq-all-4.9.8-bin-release\conf\broker.conf,配置如下

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
# 所属集群名字
brokerClusterName=DefaultCluster

# broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a,
# 在 broker-b.properties 使用: broker-b
brokerName=broker-aaaaa
# 0 表示 Master,> 0 表示 Slave
brokerId=0

# nameServer地址,分号分割
# namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876

# 启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed
# 解决方式1 加上一句 producer.setVipChannelEnabled(false);,解决方式2 brokerIP1 设置宿主机IP,不要使用docker 内部IP
brokerIP1=2.0.0.1

# 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4

# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 
autoCreateTopicEnable=true

# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true

# Broker 对外服务的监听端口
listenPort=10911

# 删除文件时间点,默认凌晨4点
deleteWhen=04

# 文件保留时间,默认48小时
fileReservedTime=120

# commitLog 每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824

# ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000

# destroyMapedFileIntervalForcibly=120000
# redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
# storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
# commitLog 存储路径
# storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
# 消费队列存储
# storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
# 消息索引存储路径
# storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
# checkpoint 文件存储路径
# storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
# abort 文件存储路径
# abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
# 限制的消息大小
maxMessageSize=65536

# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000

# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=ASYNC_MASTER

# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

# 发消息线程池数量
# sendMessageThreadPoolNums=128
# 拉消息线程池数量
# pullMessageThreadPoolNums=128


maxTransferCountOnMessageInMemory=400

7,最重要的,😃😃😃😃😃😃😃😃😃😃😃😃,在启动broker的时候,必须要指定broker.conf,不然不奏效,可以将broker.conf移动到/bin 下,命令如下

start mqbroker.cmd -n 127.0.0.1:9876 -c broker.conf

8,启动mq 的控制台,可以观察到,broker的配置已被更改

集群 --> 配置 --> maxTransferCountOnMessageInMemory 被更改