问题

data-srv测试服存在消息,一直处于NOT-CONSUME-YET状态,几率很大。

排查过程

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