我的服务端是5.2.0,客户端是4.9.1,在发送消息的时候报了 15 Request doesn't have field bname的报错,我看proxy里的源码是需要判断请求里是否存在bname这个字段
if (request.getCode() == RequestCode.SEND_MESSAGE_V2) {
if (request.getExtFields().get(BROKER_NAME_FIELD_FOR_SEND_MESSAGE_V2) == null) {
return RemotingCommand.buildErrorResponse(ResponseCode.VERSION_NOT_SUPPORTED,
"Request doesn't have field bname");
}
brokerName = request.getExtFields().get(BROKER_NAME_FIELD_FOR_SEND_MESSAGE_V2);
} else {
if (request.getExtFields().get(BROKER_NAME_FIELD) == null) {
return RemotingCommand.buildErrorResponse(ResponseCode.VERSION_NOT_SUPPORTED,
"Request doesn't have field bname");
}
brokerName = request.getExtFields().get(BROKER_NAME_FIELD);
}
我排查下来是因为4.9.1版本的SendMessageRequestHeader中缺少了requestHeader.setBname(mq.getBrokerName());这段代码和RpcRequestHeader这个父类。
我修改了这部分代码并在createSendMessageRequestHeaderV2中增加了字段n后就可以正常发送消息了,但是我看兼容性文档中说rocketmq5是完全兼容rocketmq4.9版本的,所以想问一下在不升级客户端的情况下是否有其他方式发送消息或者说只能升级客户端版本才行,谢谢。
具体的修复是不是在这里完成的?[ISSUE #3905] Support bname in protocol for 4.9.x client
从你的描述来看,RocketMQ 5.2.0服务端确实要求SEND_MESSAGE_V2请求中包含bname
字段,而4.9.1客户端版本并未添加该字段。按照官方文档,RocketMQ 5应该是向后兼容4.9.x的,但在这种情况下,由于协议字段的变化导致了兼容性问题。如果您无法升级客户端至与服务端匹配的版本,一种临时解决方案是在客户端补丁级别解决此问题,例如参照您提到的GitHub ISSUE #3905进行修改。然而,为了长期稳定性和功能完整性,建议升级客户端至与服务端相匹配的版本。
RocketMQ 5.0 引入了新的协议版本,而 RocketMQ 4.9.1 使用的是旧的协议版本。因此,在客户端和服务器端版本不匹配的情况下,可能会出现兼容性问题。
为了解决这个问题,你可以考虑以下两种方法:
升级客户端到 RocketMQ 5.0 或更高版本,以匹配服务器端的协议版本。这样可以避免兼容性问题,并确保正常的通信。
如果你无法升级客户端,可以考虑使用 RocketMQ 4.9.1 版本的代理来兼容 RocketMQ 5.0 的客户端。你可以在代理中添加逻辑来处理 RocketMQ 5.0 中的新字段,并在发送请求时将其设置为默认值或忽略该字段。这样可以确保 RocketMQ 4.9.1 客户端与 RocketMQ 5.0 服务器之间的正常通信。
需要注意的是,第二种方法可能会导致一些功能上的限制或不兼容的情况。因此,建议尽量升级客户端以保持最佳的兼容性和稳定性。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。