RocketMq版本升级浪费的时间

185 阅读2分钟

背景

公司说rocketmq的版本太低,需要升级到4.8.0版本,理由是客户端版本<=4.7.1的客户端ID暴露了acl的用户名密码,在grafana监控和rocketmq助手可以通过查看客户端ID直接查到用户名密码

问题

在我将项目里的rocketmq-spring-boot-starter版本由2.1.1升级到2.2.0以后,出现了无法注册,无法消费的情况。本以为是2分钟解决改个版本号的小活,没想到却花了五个小时的时间排查、测试、确认。打开日志出现如下异常。

image.png

解决

我的项目中的场景是,在同一个项目里,存在同一个server下的多个消费组。项目没有配置全局的rocketmq.consumer.access-keyrocketmq.consumer.secret-key。由于消费组A没有在RocketMQMessageListener中指定accessKeysecretKey。但是消费者B指定了。

主要原因在以下这段代码

img_v3_02ih_134bd6fa-dd36-4af4-9299-39b9da86437g.jpg

在2.1.1版本中获取clientId的行为和2.2.0的区别

image.png

img_v3_02ih_b52125f3-049c-4529-911a-d395ad2b642g.jpg

所以导致了MQClinetInstance的使用错误。从而出现异常。

反问

  1. 如果这样,那岂不是共用配置了?是bug还是设计如此? 通过对比2.2.2版本和2.3.0版本,我认为是版本的设计缺陷,理由如下。

在2.2.2版本中,修改了getInstanceName方法

img_v3_02ih_ab8771ce-01e6-4239-8da4-056108501a6g.jpg

而2.3.0版本中将配置给用户自己配置了,同时删除了RocketMQUtil中的getInstanceName方法

img_v3_02ih_f12c62a2-8ba1-45a1-b3b3-24d29e9f702g.jpg

解决

由于公司推荐2.2.0版本,故采用了这个版本,同时添加了apollo的全局配置rocketmq.consumer.access-keyrocketmq.consumer.secret-key解决了这个问题。

收获

  1. 得益于严谨的态度,我在测试环境自测了。使得问题提前发现,没有等到晚上发布再发现,避免了自己焦头烂额。
  2. 在排查过程中,由于项目代码很多,去除其他消费组的影响,使得更快的解决了这个问题,迷茫的时候,尝试降低问题的复杂度是个好方法。