使用Push模式拉取消息时,可以设置拉取线程每次从broker拉取的消息量(pullBatchSize),同时也可以设置消费线程每次消费的最大消息的数量,即:consumeMessageBatchMaxSize。但是有时候,设置的值跟预期读取的消息的数量不一致,例如:
consumer.setPullBatchSize(50);
consumer.setConsumeMessageBatchMaxSize(50);
期望线程每次从broker拉取到50条消息,同时消费线程每次消费 50 条消息,但是实际发现,最大只拉取到了32条消息,消费也只消费了32条消息。
首先,pullBatchSize的大小受制于broker配置文件中 maxTransferCountOnMessageInMemory 参数的设置,该参数默认设置为 32,也即是每次从服务端拉取的最大的数量不能超过32,因此即使设置 pullBatchSize超过32,最后也只返回32。因此,若要每次拉取的消息量超过32,可以修改broker配置文件里该参数的值,并重启broker服务。
broker读取消息的判断是在:DefaultMessageStore.getMessage()方法中的,isTheBatchFull 判断中的
其次,每个消费线程消费批次消费的消息数量,consumeMessageBatchMaxSize 也跟pullBatchSize相关,消费线程实际上每次消费的消息数量不会大于 pullBatchSize,具体可以查看ConsumeMessageConcurrentlyService.submitConsumeRequest(),消费任务的提交。
因此,实际上 consumeMessageBatchMaxSize <= pullBatchSize <= maxTransferCountOnMessageInMemory 。