解决RocketMQ死信队列不消费问题

在配置RocketMQ死信队列时遇到消费问题,经过排查发现是权限设置导致。通过修改RocketMQ Topic的权限(perm)为6,解决了死信队列不被消费的状况。但目前解决方案需要手动修改服务器权限,寻求更便捷的代码或配置方式。

分享知识 传递快乐

因为需要处理死信队列问 RocketMQ 官方死信队列配置,将死信队列配置到服务中,代码配置啥的都没问题,可就是不消费。经过多从磨难终于抛开云雾见明月,下面记录一下。

pom.xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>

yml

spring:
  cloud:
    ### Spring Cloud Stream 配置项,对应 BindingServiceProperties 类
    stream:
      ### Binding 配置项,对应 BindingProperties Map
      bindings:
        # 事务消费者
        tx-input:
          destination: tx-topic
          contentType: application/json
          group: tx-group
          consumer:
            #多线程
            concurrency: 20
            #重试1次
            maxAttempts: 2
        # 死信队列配置
        dlq-input:
          destination: '%DLQ%${spring.cloud.stream.bindings.tx-input.group}'
          contentType: application/json
          group: dlq-group
          consumer:
            concurrency: 20
      ### Spring Cloud Stream RocketMQ 配置项
      rocketmq:
        binder:
          name-server: 172.16.1.100:9876 # RocketMQ 服务器地址
        bindings:
          tx-input:
            consumer:
              # 异步消费消息模式下消费失败重试策略,默认为 0,重试失败直接进入死信队列
              delayLevelWhenNextConsume: -1


java

@StreamListener(ConsumeConfig.ConsumeSink.DLQ_INPUT)
void dlqInput(Message message);


在使用控制台查询死信消息队列的时候会报错:

org.apache.rocketmq.client.exception.MQClientException: Can not find Message Queue for this topic, %DLQ%tx-group See http://rocketmq.apache.org/docs/faq/ for further details.


第一次遇到这种问题TMD无从下手,为了解决问题,不停的查阅资料、尝试,最后终于在 github 上的 RocketMQ 官方评论中知道上面的问题,竟然是是 RocketMQ 权限问题。虽然知道是权限问题了,接下来怎么改?改成什么?都是一无所知。有陷入沉思......

通过 RocketMQ 的管理命令查看所有的 topic,%DLQ%tx-group 确实是存在,那么为啥不消费呢?


在查看该 topic 信息时,发现 perm 为 2,

bin/mqadmin topicRoute -n 172.16.1.100:9876 -t %DLQ%tx-group

当看到这里时终于看见的黎明的太阳,于是修改 topic 的 perm 为 6:

bin/mqadmin updateTopic -b 172.16.1.100:10911 -n 172.16.1.100:9876 -t %DLQ%tx-group -p 6

 当消费者再次连续达到指定失败次数时,就会走到死信队列中消费。


RocketMQ权限

  • PermName.PERM_INHERIT:Topic继承,value:1
  • PermName.PERM_READ:Topic读,value:4
  • PermName.PERM_WRITE:Topic写,value:2

perm=7 #可继承、读、写

perm=4 #可读

perm=2 #可写

RocketMQ的Topic自动新建是通过继承TBW102实现的,如果把TBW102的perm改为6,将不会自动创建Topic。

疑惑:

虽然上述配置解决了死信队列不消费问题,但每次都要通过命令修改权限来达到死信队列消费。

这种方式必须要进入服务器进行修改,才可以生效,还是比较麻烦的,不知道有没有通过代码或配置的方式达到相同的操作,如果有其他解决方案或思路的还请留言告诉小编,让小编也能学习一下。
 

—————————
如有不足请留言指正
相互学习,共同进步

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值