一、现象反馈

同事发现一个主题的某个分区卡主不再消费,如下图所示,通常这种情况是客户端消费线程阻塞造成的。而这次确不是,而且该现象还是头一次遇到,邪乎。

二、问题定位

1.日志分析

在消费客户端发现了如下错误,显示着该消息不合法,超过了RocketMQ消息大小限制。

org.apache.rocketmq.client.exception.MQBrokerException: CODE: 13  DESC: the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k.
For more information, please visit the url, http://rocketmq.apache.org/docs/faq/at org.apache.rocketmq.client.impl.MQClientAPIImpl.processSendResponse(MQClientAPIImpl.java:711) ~[rocketmq-client-4.7.0.jar:4.7.0]at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:505) ~[rocketmq-client-4.7.0.jar:4.7.0]at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:487) ~[rocketmq-client-4.7.0.jar:4.7.0]at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:431) ~[rocketmq-client-4.7.0.jar:4.7.0]

2.源码跟踪

跟踪RocketMQ报错的地方如下:

handlePutMessageResult{switch (putMessageResult.getPutMessageStatus()) {case PUT_OK:sendOK = true;response.setCode(ResponseCode.SUCCESS);break;// ...case MESSAGE_ILLEGAL:case PROPERTIES_SIZE_EXCEEDED:response.setCode(ResponseCode.MESSAGE_ILLEGAL);response.setRemark("the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k.");break;}
}

跟下去看到是消息属性过大造成的。

private PutMessageStatus checkMessage(MessageExtBrokerInner msg) {if (msg.getTopic().length() > Byte.MAX_VALUE) {log.warn("putMessage message topic length too long " + msg.getTopic().length());return PutMessageStatus.MESSAGE_ILLEGAL;}if (msg.getPropertiesString() != null && msg.getPropertiesString().length() > Short.MAX_VALUE) {log.warn("putMessage message properties length too long " + msg.getPropertiesString().length());return PutMessageStatus.MESSAGE_ILLEGAL;}return PutMessageStatus.PUT_OK;
}

3.消息确认

既然消息不合法,那就捞出来看看它长啥样,通过检索命令查看:

bin/mqadmin  queryMsgByOffset -n x.x.x.x:9876 -t delay_notify_level_04_topic -b latency_mq_a2 -i 1 -o 62565613

消息内容

RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
OffsetID:            0A6F1AEE00002A9F0000070BD4CE3505
Topic:               delay_notify_level_04_topic
Tags:                [delayStrategy]
Keys:                [2559003397109317634]
Queue ID:            1
Queue Offset:        62565613
CommitLog Offset:    7747396318469
Reconsume Times:     0
Born Timestamp:      2021-11-09 00:00:01,721
Store Timestamp:     2021-11-09 00:00:01,725
Born Host:           x.x.x.x:40046
Store Host:          x.x.x.x:10911
System Flag:         0
Properties:          {uber-trace-id=30863ccffc4785f65fcd844b53882621%3Aba4f3c364e11d4c2%3A75c3cab020852919%3A0, uberctx-us_app=AppRcpOperatingService, clientAppId=AppRcpOperatingService, reqId=359a420f5e0644c4a24ce653fc1003b7, MIN_OFFSET=62046858, MAX_OFFSET=62576938, KEYS=2559003397109317634, uberctx-us=asyncSend%3Arcp_alert_delay_topic, rpcId=1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.
//.......
11.1.3.1.1.3.7.41.9.5.1.1.11.1.27.1.1.5.3.4.2.2.2.20.9.1.7.1.1.15.3.1.7.1.1.1.1.1.5.7.1.1.1.1.1.1.1.3.1.3.1.3.1.1.3.1.1.1.3.1.1.1.1.3.1.1.1.1.3.5, UNIQ_KEY=0A484BC80001764C12B62932E6B9247C, WAIT=true, TAGS=delayStrategy}
Message Body Path:   /tmp/rocketmq/msgbodys/0A484BC80001764C12B62932E6B9247C

备注:消费体内容存储在/tmp/rocketmq/msgbodys/0A484BC80001764C12B62932E6B9247C,内容小于1KB,发现其Properties部分有个rpcId通过测算其长度长达33KB,问题就出在这里,RocketMQ最长为32KB。

4.阻塞根因

  • 使用场景为消费服务从某主题消费消息进行业务处理后再发送到其他主题

  • 消费服务在获取到这条大Properties消息后使用自定义封装的消息SDK发送

  • 自定义的SDK会在Properties增加一些属性,由于超过32KB导致该消息一直发不成功,从而造成阻塞

三、解决方案

解决思路有两个:

  • 一个是消费服务让拿到消息后不要再发送了,把位点提交了就好了

  • 另外一个是通过在broker中手动修改消费组的消费位点consumerOffset.json,把这条大消息跳过去

第一种需要修改SDK代码,测试升级周期较长,为快速解决该问题选择了第二种解决方式。

将consumerOffset.json中的62565631修改为62565632,从而跳过问题消息。需要注意的是修改时需要把消费者下线并关闭broker,否则修改不成功,该位点会从消费服务的缓存中上报。

还有就是追踪该巨无霸rpcId产生的不合理使用场景追踪,从而彻底规避该问题的产生。

MQ46# 实战|RocketMQ分区阻塞应急处理相关推荐

  1. 【kafka实战】分区重分配可能出现的问题和排查问题思路(生产环境实战,附视频)

    超强!!! Kafka高质量专栏学习大全,点我获取!!! 文章目录 前提 所有异常情况 1. TargetBroker若不在线,迁移脚本执行会失败 情景演示 2. TargetBroker在开始迁移过 ...

  2. mysql truncate partition_实战mysql分区(PARTITION)

    前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...

  3. 实战 RocketMQ 流量削峰,怎么能错过这一篇!

    作者:WilsonHe juejin.im/post/5ea159e4f265da47f0794da5 前言 MQ的主要特点为解耦.异步.削峰,该文章主要记录与分享个人在实际项目中的RocketMQ削 ...

  4. Linux从入门到实战 ---- 磁盘分区

    文章目录 fdisk 分区 添加新的硬盘 添加快照 创建新的硬盘 查看磁盘的信息 分区操作 主分区 逻辑分区 查看分区情况 设置文件系统 主分区的文件系统 将逻辑分区设置为ext2 mount挂载分区 ...

  5. add partition mysql_实战mysql分区(PARTITION)

    前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...

  6. java并发编程实战学习(3)--基础构建模块

    转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put ...

  7. mysql删除分表键_一文看懂 MySQL 分区和分表,提高表增删改查效率

    原标题:一文看懂 MySQL 分区和分表,提高表增删改查效率 作者:冯帅,精通Oracle. MySQL. 擅长异构数据库数据同步及迁移.数据库的设计和调优,对高可用方案有深入研究. MySQL分区和 ...

  8. 应急响应的整体思路和基本流程

    2018 年信息安全事件频发,信息安全的技能.人才需求大增.现在,不管是普通的企业,还是专业的安全厂商,都不可避免的需要掌握和运用好信息安全的知识.技能,以便在需要的时候,能够御敌千里.所谓养兵千日, ...

  9. 港口应急广播系统方案

    一.港口建设恶劣天气应急广播必要性 近年来,我国频繁性发生突发性极端天气自然灾害(如:强台风,强暴雨,雾霾,冰雪等),给港口生产作业安全运行造成很大损失.当发生强对流自然灾害公共突发事件时,应急广播是 ...

最新文章

  1. 项目执行maven update时,报:Preference node org.eclipse.wst.validation
  2. C++ trivial和non-trivial构造函数及POD类型(转)
  3. 被围绕的区域(dfs)
  4. JAVA中string的赋值_Java中关于String赋值的两种形式
  5. 一些Select检索高级用法
  6. php mysql销售_计算用于销售应用程序的php / mysql中的损益(每日,每月和每年)...
  7. opencv显示中文
  8. [转载] java简易爬虫Crawler
  9. 硬核! BAT 究竟是怎么玩转中台的!
  10. Java之String,StringBuffer,StringBuilder比较
  11. 【系列二之图像处理系列】波形处理(3)
  12. button css背景透明,css背景透明
  13. 论文笔记:针对盲化的 RSA算法的水平聚类侧信道攻击
  14. Largest Rectangle in a Histogram 题解 Python
  15. keil遇到FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘解决方法
  16. html图标 白块,桌面图标变成白块了?不用怕,1分钟就搞定!
  17. torch.utils.data.WeightedRandomSampler采样
  18. 第七天你知道TLE是什么了吗(特别感谢英雄哥友情出演
  19. 快速实现 分页器(超简单) 可以直接用
  20. JavaScript高级程序设计-JavaScript API

热门文章

  1. 中国重点类型咨询信息领域经营发展规模
  2. 华为交换机删除配置命令access_华为配置命令交换机密码清除
  3. 【转】用ATL创建COM组件详细解说
  4. 图书管理系统的UML建模
  5. 我们的童年,永远停滞的童年!
  6. 乐视2支不支持html,乐2有NFC吗 乐视手机2支持NFC功能吗?
  7. python XGboost回归预测 算法实现和原理讲解(比赛青睐)
  8. Pulsar和Kafka基准测试:Pulsar性能精准解析(完整版)
  9. Python学习篇——绘制佩琪
  10. Mysql学习笔记(二)——表格及数据的插入