今天在开发环境发现使用rocketmq延迟消息不能被正常转换为正常topic消息,花了很长时间排查发现是offsetId的问题。
延迟消息topic统一为SCHEDULE_TOPIC_XXXX,当延迟时间到了,消息自动转化为设置的实际topic。延迟消息如下图所示:
然后开始排除问题:发现broker配置都很正常。messageDelayLevel使用的默认配置,18个level都正常。
然后就是level从1开始试,dalayLevel = 1正常,dalayLevel = 2正常,dalayLevel = 3开始往后都不正常,都不能被消费了。此事确实奇怪,然后就开始网上找答案,终于发现rocketmq还有可以配置的地方,如下:
在这个目录下找到config目录,如图:
仔细看delayOffset.json这个文件,就会发现包含delayLevel的18个等级的offsetId记录,刚好也能解释为什么等级1和2能成功,从3开始,offsetId就错乱了,那么就需要重置offsetId。
方法如下:
第一步:修改broker写权限,让消息不再进来
bin/mqadmin updateBrokerConfig -b broker的IP:broker端口 -n nameServer的IP:端口 -k brokerPermission -v 4
第二步:查看当前流量是不是已经为0
bin/mqadmin clusterList -n broker的IP:broker端口
第三步:停止broker
bin/mqshutdown broker
第四步:
清理掉config下边的delayOffset.json和delayOffset.json.bak文件
第五步:
清理掉consumequeue/SCHEDULE_TOPIC_XXXX目录
第六步:重启broker
第七步:修改broker写权限
bin/mqadmin updateBrokerConfig -b broker的IP:broker端口 -n nameServer的IP:端口 -k brokerPermission -v 6
此时就会发现delayOffset.json变成下边这样了:
好了,大功告成,测试一下,也能正常消费了。
又能愉快玩耍了,不过中间走了一些弯路,因为rocketmq有报错日志storeerror.log里面能直接看出来错误信息。storeerror.log这个文件大家可以全局搜索一下,一般在home目录下。