【RocketMq】RMQ开源版本Push消费模式为什么批量消费最大拉取数量是32?(MAC)

430 阅读1分钟

1 介绍: 由阿里巴巴开源

Apache 基金会顶级项目 gitHub地址 github.com/apache/rock…

2 本地安转运行MAC

上图步骤分别是:

1 namesrv 服务,启动前注意更改IDE的环境变量 ROCKETMQ_HOME,并将distribute module下的四个配置文件Copy到ROCKETMQ_HOME目录,修改conf文件如上图(三)黄色文字部分。

2 配置文件

3 conf文件,命名broker名字等相关配置

4 启动broker服务,注意上图(⑤)的参数配置

5 IDE 参数配置

6 运行quickstart的生产者

7 运行quickstart的消费者

8 查看运行日志

3 回到问题为啥消费者最大批量消费是32?

源码中的两个参数解释如下

    /**
     * Batch consumption size   客户端从broker一次拉取后,实际消费的最大数量 <= pullBatchSize
     */
    private int consumeMessageBatchMaxSize = 1;

    /**
     * Batch pull size  客户端从broker一次拉取最大数量 <= 服务端的实际参数限制
     */
    private int pullBatchSize = 32;

即最终决定批量最大数是由服务端控制;

服务端源码中:org.apache.rocketmq.store.DefaultMessageStore#isTheBatchFull 方法限制一次请求最大回传数量;

    private boolean isTheBatchFull(int sizePy, int maxMsgNums, int bufferTotal, int messageTotal, boolean isInDisk) {

        if (0 == bufferTotal || 0 == messageTotal) {
            return false;
        }

        if (maxMsgNums <= messageTotal) {
            return true;
        }

        if (isInDisk) {
            // maxTransferBytesOnMessageInDisk = 1024 * 64 磁盘字节数即64KB
            if ((bufferTotal + sizePy) > this.messageStoreConfig.getMaxTransferBytesOnMessageInDisk()) {
                return true;
            }

            // maxTransferCountOnMessageInDisk = 8 磁盘拉取条数
            if (messageTotal > this.messageStoreConfig.getMaxTransferCountOnMessageInDisk() - 1) {
                return true;
            }
        } else {
            // 默认1024 * 256,此处限制了内存中的字节数即 256KB
            if ((bufferTotal + sizePy) > this.messageStoreConfig.getMaxTransferBytesOnMessageInMemory()) {
                return true;
            }
             
            // maxTransferCountOnMessageInMemory 默认32,此处限制了条数
            if (messageTotal > this.messageStoreConfig.getMaxTransferCountOnMessageInMemory() - 1) {
                return true;
            }
        }

        return false;
    }

由源码可知,分别修改磁盘或者内存的条数以及字节数既可以影响返回给消费者的最大批量条数。