背景

半夜三更收到公司告警信息,提示是mq生产者发送异常,一直在不停的发送告警信息。




根因分析


1,查看硬件资源,一切都正常,且是在业务低峰期,排因大流量导致的错误

2,根据告警信息去查对应的服务日志,发现一条可疑日志,properties不应该出现这么大

RockeMQ手动偏移消费者的Offset值_修改消费者offset值


3,到mq控制台查看topic情况,发现有积压,积压的offset值为62565613,这条消息被卡住


RockeMQ手动偏移消费者的Offset值_偏移消费位点_02


4,通过命令行查看消息的具体内容


bin/mqadmin  queryMsgByOffset -n test-rocketmq.com.cn:9876 -t test_topic -b broker_a2 -i 1 -o 62565613

-t :topic名称
-b: broker节点名称
-i: 分区数
-o: offset值


查出来的消息内容如图:

RockeMQ手动偏移消费者的Offset值_修改消费者offset值_03


原因是这条消息的业务逻辑是,消息要确认被认领,如果没人认领,就会不断的重复发送,直到有人认领成功,而业务使用send方法来发送,公司的sdk会把rpcid加1,就导致了上面的报错日志

 

send failed for 
org.apache.rocketmq.client.exception.MQBrokerException: CODE: 13 DESC: the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k.
For more information, please visit the url, http://rocketmq.apache.org/docs/faq/


解决方法

1,摘掉broker_a2节点的写权限


bin/mqadmin updateBrokerConfig -b 10.11.1.20:10911 -n test-rocketmq.com.cn:9876 -k brokerPermission -v 4


2,关闭mq节点


bin/mqshutdown broker


3,备份consumerOffset值并修改卡住的消息offset值

cd /data/rocketmq-a1/store/config
cp consumerOffset.json /tmp
vim consumerOffset.json
"test_topic@test_topic_consumer":{1:62565613


只需要将offset值往下移一位就好。保存退出


4,下线消费者


需要将所有消费者做下线,要不然重启broker节点,消费者会同步消费位点,还是无法跳这被卡的offset值


5,启动mq服务


cd /workspace/broker_a2
nohup bin/mqbroker -c /workspace/broker_a2/conf/2m-2s-async/broker-a2.properties &



6,将消费上线

mq启动好后,马上将消费上线



7,恢复broker_a2节点的写权限


bin/mqadmin updateBrokerConfig -b 10.11.1.20:10911 -n test-rocketmq.com.cn:9876 -k brokerPermission -v 6