之前在学习RocketMQ的时候发现了一个问题,客户端和broker之间关于topic的长度判断不一致,客户端发消息的判断为org.apache.rocketmq.client.Validators#checkTopic,这里的CHARACTER_MAX_LENGTH为255
if (topic.length() > CHARACTER_MAX_LENGTH) {
throw new MQClientException("The specified topic is longer than topic max length 255.", null);
}
复制
broker端处理请求时会进行topic长度判断,这里的判断条件如下所示,这里Byte.MAX_VALUE为127,主要有三处地方org.apache.rocketmq.store.DefaultMessageStore#putMessage
org.apache.rocketmq.broker.processor.SendMessageProcessor#sendBatchMessage
org.apache.rocketmq.broker.processor.AbstractSendMessageProcessor#msgContentCheck
if (requestHeader.getTopic().length() > Byte.MAX_VALUE) {
response.setCode(ResponseCode.MESSAGE_ILLEGAL);
response.setRemark("message topic length too long " + requestHeader.getTopic().length());
return response;
}
if(msg.getTopic().length() > Byte.MAX_VALUE) {
log.warn("putMessage message topic length too long " + msg.getTopic().length());
return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null);
}
if (messageExtBatch.getTopic().length() > Byte.MAX_VALUE) {
log.warn("PutMessages topic length too long " + messageExtBatch.getTopic().length());
return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null);
}
复制
所以当topic的长度在128与255之间时,客户端发送消息是没问题的,但是broker会一直返回消息非法状态,消息也就不会发送成功,当然一般情况下也没人把topic长度设置得这么长,所以这个问题也就一直没有被发现。
目前在4.6.1版本中将统一设置为不能大于127,详情请点击阅读原文。
文章转载自徘徊笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1483次阅读
2025-03-13 11:40:53
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
826次阅读
2025-04-09 15:33:27
2025年3月国产数据库大事记
墨天轮编辑部
591次阅读
2025-04-03 15:21:16
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
502次阅读
2025-03-13 14:38:19
征文大赛 |「码」上数据库—— KWDB 2025 创作者计划启动
KaiwuDB
413次阅读
2025-04-01 20:42:12
优炫数据库成功应用于国家电投集团青海海南州新能源电厂!
优炫软件
364次阅读
2025-03-21 10:34:08
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
355次阅读
2025-04-10 15:35:48
国产化+性能王炸!这套国产方案让 3.5T 数据 5 小时“无感搬家”
YMatrix
340次阅读
2025-03-13 09:51:26
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
282次阅读
2025-04-11 09:38:42
从HaloDB体验到国产数据库兼容性
多明戈教你玩狼人杀
247次阅读
2025-04-07 09:36:17