一、问题场景
同JVM多WebService地址调用,在并发场景下会出现线程安全问题,现象就是请求调错地址。示例场景:同一个应用按照不同省区部署,不同省区之间通过不同的WebService地址进行访问,业务上通过不同的省区编码获取不同的WebService地址进行不同的省区服务调用,此时在并发场景下就会出现线程安全问题。示例图如下:

二、问题源码分析
调用客户端采用的是手动创建,代码示例如下:

但从代码上来看,每次都是新new的对象原则上是不会产生线程安全问题,同时通过源码分析,找到BusFactory.getDefaultBus()方法,会发现他采用的是静态对象,代码示例如下:



这样的话,在并发场景的情况,静态变量就有可能别其他线程访问者给替换到,倒置调用到别的地址上去。至此找到问了问题原因,那如果解决当前问题呢,参考下文:
三、问题解决
通过源码查找,我们找到了每次都创建新的BUS类方法
Bus bus = BusFactory.newInstance().createBus();
调整后的代码示例如下:

查看createBus方法实现,会发现每次都是新new的ExtensionManagerBus对象。至此问题解决

四、其他优化建议
在高并发场景下,如果每次都去新new类在去创建连接,同时通过三次捂手创建连接,系统性能开销较大。可以尝试在服务端开启连接保持,同时,在客户端通过地址对连接客户端进行缓存。请求过来后,优先通过地址key从缓存里获取客户端信息直接进行访问调取,这样将会大大的减小性能开销。

4126

被折叠的 条评论
为什么被折叠?



