问题
data-srv测试服存在消息,一直处于NOT-CONSUME-YET状态,几率很大。
排查过程
- 检查订阅sdk,确认是否回复ack.√
• 修正订阅时,拉取到多个msg时,只处理一个handler的问题。 该bug不会造成not-consume。
• 修正路由注册时,可能造成subscirbe同一个topic/tag多次的问题。 该bug不会造成not-consume。
• 确认了已经回复了ack。 - 检查consumergroup,是否存在订阅关系不一致。.√
• 检查了消费方的消费组名,都叫GID_datasrv_test,没有问题.
• 确认了该应用组都是一套代码,订阅话题相同,没有问题。 - 检查是否有其它应用,错用了消费组,存在异常竞争。
• 在第一步和第二步无法查到错误的前提下,决定对测试服节点关停,只留一个本地节点,测试sdk。
• 测试服关停后,后台发现 GID_datasrv_test 的节点数量依旧为2,x.x.x.x:31556
• 登录测试服,使用 sudo lsof -i:31556, 发现cardlibsrv竟然在datasrv_test的消费组里。 - 修正
• 通知cardlibsrv负责人,更换消费组名。
• GID_datasrv_test暂时修改为GID_datasrv_test_v2.
总结
• 同一个应用组,必须保持订阅关系一致。如果另一个应用误设consumername,哪怕没有显式执行subscribe,也会造成rocketmq将消息意外投递到该应用去。
• 消费组集群在多节点部署时,允许增量消息短暂失败,走重试逻辑。