之前在学习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,详情请点击阅读原文。