【RocketMQ】记录一次广播模式消费遇到的问题

电玩女神 2023-10-02 14:03 61阅读 0赞

文章目录

    • 问题详情
    • 问题定位
    • 问题解决

问题详情

业务团队反馈使用RocketMQ时,消费失败,报如下的错误:

错误1:

  1. java.io.FileNotFoundException: C:\Users\zhurunhua\.rocketmq_offsets\10.201.241.170@172.24.140.45:9876;172.24.130.73:9876@12188\sas_rule_event_consumer\offsets.json.tmp (文件名、目录名或卷标语法不正确。)
  2. at java.io.FileOutputStream.open0(Native Method) ~[?:?]
  3. at java.io.FileOutputStream.open(FileOutputStream.java:298) ~[?:?]
  4. at java.io.FileOutputStream.<init>(FileOutputStream.java:237) ~[?:?]

错误2:

1489db75bd51dcbde6f227b4d53e9923.png

问题定位

根据异常信息中的一些文字:“.rocketmq_offsets”、“offsets.json”,能判断出:

  • 程序使用了广播模式消费,因为使用广播模式消费的话,消费者会在本地保存offset信息(如果是集群模式消费,保存在服务端Broker上)
  • 在创建本地offset文件的时候,因为命名规则问题,导致文件夹/文件创建失败

所以需要查看源码,确定一下在广播模式下,offset文件的生成规则即可定位到问题,阅读源码,发现两个相关联的类:

  • org.apache.rocketmq.client.ClientConfig
  • org.apache.rocketmq.client.consumer.store.LocalFileOffsetStore

c058da043b66ff25a8ef6e8dbf783bcf.png

这里定义了文件的路径和文件名,默认为:/用户根目录/.rocketmq_offset/消费者ClientId/消费组名/offsets.json

778aa05377070c9b6fbc9b5b24e81d74.png

这里定义了消费者ClientId的生成规则,默认为:本机IP@instanceName@unitName

根据之前程序日志分析,现在问题就出在instanceName上,这个字段默认是取系统参数:rocketmq.client.name的值,如果没有配置,则为字符串“DEFAUT”,当为“DEFAULT”时,会被转为当前应用的PID

99a9c70f32408b6dd7b3d3f994fd220a.png

但是从程序报错日志来看,本地offset文件的命名规则并不是上述这样,而是本地IP@NameServer地址@应用PID,而业务团队使用的RocketMQ客户端并非原生的客户端,是公司内部封装的xcloud客户端,所以猜测,xcloud客户端内将Instance参数替换成了nameserver,查看xcloud代码,果然发现:

2459651e9aa8baa92b7d68472251254b.png
82cb47960324c9ecec22711318cd2397.png

问题解决

方案一:修改xcloud代码,保证ClientId的生成规则和官方一致;

方案二:缩短nameserver地址;

方案三:使用原生的Consumer客户端

发表评论

表情:
评论列表 (有 0 条评论,61人围观)

还没有评论,来说两句吧...

相关阅读

    相关 RocketMQ消息消费

    消息消费以组的模式开展,一个消费组内可以包含多个消费者,每一个消费组可订阅多个主题,消费组之间有集群模式与广播模式两种消费模式。集群模式,主题下的同一条消息只允许被其中一个消费