前言RocketMQ配置中有一个设置项为transferMsgByHeap,即是否通过堆内存传输数据 。在文章“RocketMQ存储--同步刷盘和异步刷盘”中对其进行过梳理 。那transferMsgByHeap是开启好呢?还是关闭好!第二个问题是可以设置消费的线程数,由于无界队列所以只需要设置最小线程数consumeThreadMin即可,那在rocket-client4.7版本中还能这么用吗?
一、transferMsgByHeap误解transferMsgByHeap设置为false时,通过堆外内存传输数据,相比堆内存传输减少了数据拷贝,即:零字节拷贝,效率更高 。所以关闭transferMsgByHeap应该成为我们的优先选择,但是实践来看,你或许会改变想法,下面是transferMsgByHeap=false,客户端大量超时错误时的日志截图 。
1.Broker日志截图

文章插图
broker日志
2.CPU日志截图

文章插图
CPU截图
3.系统日志截图

文章插图
系统日志
4.源码报错截图

文章插图
源代码截图
小结:你看到这里会发现,在关闭transferMsgByHeap时,可能造成堆外内存分配不够,触发系统内存回收和落盘操作 。此时CPU会有一个陡坡,具体客户端表现为发送大量超时 。解决方式开启transferMsgByHeap即可,让运行更加平稳 。
二、消费的最小线程数我们在使用rocketmq消费时,有两个参数consumeThreadMin和consumeThreadMax 。在以往的版本中,我们只需要设置consumeThreadMin即可,例如consumeThreadMin=64 。在rocket-client4.7版本中,如果设置consumeThreadMin=64会导致消费失败,下面看下原因 。
1.错误提示
org.Apache.rocketmq.client.exception.MQClientException: consumeThreadMin (64) is larger than consumeThreadMax (20)2.源码原因
文章插图
4.1

文章插图
4.7
小结:在rocketmq-client新版本中,增加了consumeThreadMax的判断 。当consumeThreadMin大于20时需要同时设置consumeThreadMax,所以单独设置consumeThreadMin=64会抛出错误导致消费失败 。
【RocketMQ内存传输及4.7消费线程参数设置】
推荐阅读
- 终极篇 两台电脑如何直接用一根网线传数据?两台电脑连网线是如何数据传输的?
- 网络、cpu、内存、io、文件 linux下资源监控和分析工具汇总
- Linux内存管理之MMU的过程
- 如何监视Python程序的内存使用情况
- 加装内存前先要了解的
- 华为传输软件叫什么?
- 最高2T内存,小至火柴盒大小,爱国者移动固态硬盘体验
- 怎样禁止钉钉外发文件?钉钉文件传输协议分析
- Netty 中的内存分配浅析
- scp文件传输命令详解,每日一命令
