RocketMQMessageListener使用错误问题分析与排查

背景

RocketMQ与SpingBoot相结合可以大大降低我们开发的复杂度,但是最近在一个新项目中使用RocketMQMessageListener 监听消息,导致消费者启动失败,提示该消费组已经被创建了,请重新申请一个消费者组。

Caused by: org.apache.rocketmq.client.exception.MQClientException: The consumer group[pomp_pstConsumerGroup] has been created before, specify another name please.

于是更换了一个消费者组,依然提示上面的错误。

问题分析

代码中没有看出有什么异常之处,在Nacos中预制了一个开关,然后控制消费逻辑。

@RocketMQMessageListener(consumerGroup = "pomp_pstConsumerGroup",topic = "pts-topic")
@Component
@RefreshScope
public class PtsAuditConsumer implements RocketMQListener<PtsAuditEvent> {

    @Value("${mq.swtich:false}")
    private boolean isStop;

    @Override
    public void onMessage(PtsAuditEvent event) {
        if(isStop){
            return;
        }
        // 省略业务代码
    }
}

我们在RocketMQ 消费者启动代码中发现,是在DefaultMQPushConsumerImpl类中525行报错,原因是在

第521行注册消费者的时候注册失败了。

image-20230910080955419

于是在registerConsumer中我们看到在执行putIfAbsent的时候出错了,说明消费者组与消费者是一一对应的,导致注册失败了。

image-20230910080857231

但是我在项目中检查,该消费者组与消费者并没有重复出现,那么Spring为什么会提示重复呢?既然提示消费者重复,那么我们在启动消费者的时候指定instanceName名,继承RocketMQPushConsumerLifecycleListener,随机生产一个uuid作为instanceName,这样确保Consumer不会重复。

    @Override
    public void prepareStart(DefaultMQPushConsumer defaultMQPushConsumer) {
        defaultMQPushConsumer.setInstanceName(UUIDUtil.getUUID32());
    }

此时消费者已经启动了,但是我们在RocketMQ的控制台可以看到,该topic下有四个queue,有两个consumerClient均分4个queue。此时又开始疑惑了,命名只启动了一个消费者,为什么会有两个consumerClinet呢?这也就是为什么不指定InstanceName时消费者组重复的根本原因。

image-20230910082429278

于是开始推测,是什么原因导致Spring在启动的时候,该Bean在被创建了两次?最后我们从RocketMQMessageListener加载的代码开始分析问题。

image-20230910085018281

果然在ListenerContainerConfiguration中获取RocketMQMessageListener注解的所有实例,获取到两个,这两个消费者是指向同一个类,其中一个的bean是以scopedTarget开头,那么我们就要寻找在什么地方将beanName代理成了scopedTarget.beanName。

image-20230910092637263

在最终debug下我们发现在ScopedProxyUtils中会将加了@RefreshScope注解的类重新代理了,这就导致我们在注入RocketMQ在启动消费者的时候加载了两次。所有我们最终得出结论,RocketMQMessageListener与RefreshScope注解不能同时使用,可以将RefreshScope作为一个Configuration注入到消费者即可。

思考

1、使用了@RefreshScope + 指定instanceName的方式启动消费者有什么问题?

由于指定了instanceName导致服务中存在两个消费者,如果在Nacos中刷新了配置,则有一个消费者能监听到配置更新,另一个消费者无法监听到配置更新;另一方面频繁的更新配置会触发消费者reblance机制,使得消费性能下降。

2、如果使用了Apollo作为配置中心,是否存在这个问题呢?

Apollo不依赖于RefreshScope 的作用域,所有不加RefreshScope 注解,Apollo也可正常启动,不受影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着LTE技术的不断发展,各种无线网络设备的应用日益广泛。在LTEFDD上行频段干扰问题中,对于用户而言,产生了诸如网络质量下降、连接延迟、音频通话中断等一系列问题。为了解决这些问题,需要进行干扰分析排查。本篇文章将对LTEFDD上行干扰分析排查指导书进行探讨,并为大家提供一些指导建议。 1、干扰现象的描述 在进行干扰分析时,我们首先需要了解干扰现象的具体表现,这将有助于我们快速确定干扰原因。根据LTEFDD上行干扰现象的表现,我们可以归纳出以下几种情况: (1)网络信号弱 当发生干扰时,信号强度和质量都会下降,导致网络信号变得非常弱。 (2)连接失败或延迟 在干扰环境下,连接建立会出现很大的延迟,有时甚至连接不上。 (3)波形抖动 波形抖动是指在特定频段上出现了非正常的信号传输,表现为波形抖动或波形变形。 2、排查步骤 对于LTEFDD上行干扰问题,我们需要遵循以下步骤进行排查: (1)确定问题发生的时间和地点 要解决干扰问题,首先我们需要确定问题发生的时间和地点。这有助于我们更准确地定位干扰点。 (2)进行检查 检查是否存在其他电子设备干扰LTE信号,检查接收器和发射器之间的距离等。 (3)确定干扰类型 根据干扰的表现,确定干扰的类型。比如干扰来自于其他频段、其他电信网络、其他电子设备等。 (4)分析干扰层次 确定干扰的层次。干扰可能来自于移动终端、入网终端、网络、调制解调器等。 (5)采取措施 最后,我们需要根据干扰原因采取相应的措施来解决问题。具体措施包括加强网络信号、更换设备、采取信道隔离等。 3、干扰排查的注意事项 在进行LTEFDD上行干扰排查时,有几个注意事项需要特别注意: (1)确保安全 在排查过程中,要保障人身安全和设备安全。 (2)遵守规定 在排查过程中,要遵守有关法律法规和技术规定。 (3)注意数据保护 在排查过程中,要注意用户隐私和数据保护,避免泄露用户信息。 (4)采用专业工具 在排查过程中,要使用专业的干扰合法测试设备,确保数据的准确性和有效性。 综上所述,LTEFDD上行干扰分析排查指导书主要介绍了具体的干扰现象和排查方法,以及注意事项。我们需要采取科学、系统的方法进行干扰排查,以尽快解决用户的问题。在未来,随着技术的创新和发展,我们还需要不断改进技术,提高干扰排查的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值