目前通常我们都是在IPv4的网络环境下开发和部署系统的,所以目前大部分软件对IP地址的处理仅考虑IPv4的IP地址,大名鼎鼎的RocketMQ也不例外!
最近实验室有个项目要在纯IPv6环境下部署,项目开发也使用了RocketMQ来作为系统间通信的消息中间件。刚开始直接使用IPv6地址配置RocketMQ的Broker的地址,namesrv和broker都可以正常启动,然而在使用客户端发送消息到broker时,发现客户端无法正常工作,没办法只要通过异常信息追踪源码来解决问题。
查看源码时发现,当客户端连接namesrv时,namesrv将broker的ip地址和端口号通过”:”拼接为一个字符串(形如127.0.0.1:8898)返回给客户端的,客户端通过解析这个字符串得到broker的ip地址和端口。问题就这样产生了,客户端直接根据”:”通过String的spilt方法切割字符串得到broker的IP地址和端口号,这种解析方法在IPv4的IP地址下完全可以正常工作,而IPv6的IP地址也是通过”:”分割的,IPv6的IP地址示例为:fe80::af46:78a2:f24e:eee8,因此这样通过”:”来解析IP地址和端口号当然就会发生错误。
那怎么办,项目已经开发了,不能中途换解决方案吧,因此我开始尝试修改RockerMQ的client源码,刚改了一会儿就放弃了。为什么,改源码还是蛮麻烦的,我向来是想偷懒的,因此脑袋里想到了使用域名替换IPv6的IP地址,这样客户端解析的时候不就是没有问题了吗?捣鼓了一下,将broker的配置文件中的brokerIP1的值替换为域名,然后修改项目相应子系统的配置后,果然可以正常工作了!
所以这次算是对RocketMQ在IPv6环境下的踩坑吧!RocketMQ 作为国内第一个Apache顶级开源项目的消息中间件,相信在未来会发展的越来越好!这个小问题也会轻松解决掉的!