暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第一个开源框架的issue(RocketMQ)

徘徊笔记 2019-12-07
165


之前在学习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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论