问题背景
消息队列的nameser和broker运行后,在console无法显示,进入broker.log
,namesrv.log
显示如下报错Adjusted frame length exceeds 1677216:16777318-discarded
问题原因
经定位,rocketmq底层集群间使用netty通信,rocketmq在过去的使用中创建了大量的topic以及消费组(代码逻辑是根据时间戳去每次生成新的消费组),这一数据量不断增长,达到netty阈值,导致无法通信
GPT解释(实测无效,需要修改bin/runserver.sh bin/runbroker.sh而不是broker.conf)
com.rocketmq.remoting.frameMaxLength
是 RocketMQ 中的一个属性,用于配置消息传输的最大帧长度。每个消息在传输过程中都会被拆分成多个帧进行传输,该属性用于限制每个帧的最大长度。
要配置 com.rocketmq.remoting.frameMaxLength
,你需要编辑 RocketMQ 的配置文件,具体取决于你是使用 Apache RocketMQ 还是 Alibaba RocketMQ。
对于 Apache RocketMQ,你需要编辑 conf/broker.conf(Broker 配置文件)或者 conf/namesrv.conf(NameServer 配置文件),在文件中添加如下配置:
com.rocketmq.remoting.frameMaxLength=xxxx
其中,xxxx 是你希望设置的最大帧长度,单位是字节。
对于 Alibaba RocketMQ,你需要编辑 conf/2m-2s-sync/broker-a.properties
(Broker 配置文件)或者 conf/namesrv.properties
(NameServer 配置文件),在文件中添加如下配置:
com.rocketmq.remoting.frameMaxLength=xxxx
同样,xxxx 是你想要设置的最大帧长度,以字节为单位。
配置完成后,保存文件并重新启动 RocketMQ 以使配置生效。请注意,修改配置文件可能需要管理员权限。
需要注意的是,com.rocketmq.remoting.frameMaxLength
的默认值是 4MB(4194304 字节),如果你的消息超过这个长度,你可能需要增加该值以支持更大的消息。然而,增加最大帧长度也会增加网络传输的负载和延迟,因此需要根据实际情况进行权衡和调整。
临时解决方案
在rocketmq的bin目录下修改配置
在bin/runserver.sh bin/runbroker.sh加上一行:
JAVA_OPT="${JAVA_OPT} -Dcom.rocketmq.remoting.frameMaxLength=33554432
重启集群后生效
永久解决方案
修改topic和消费组的生成策略,定期清除
参考文档
https://blog.csdn.net/xxxzzzqqq_/article/details/130102465