Open ycren993 opened 3 months ago
https://github.com/youngyangyang04/RPC-Java/blob/a3c79b111176ab8b84151da63e715993dd126aad/version3/src/main/java/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java#L18 一致性哈希实现类,成员变量声明为static,若两个不同的主机,主机1注册一个UserServiceImpl,主机2注册一个OrderServiceImpl,如{OrderService->127.0.0.1:9999, UserService->127.0.0.1:4399},此时Client串行请求两个远程调用,有极大概率出现bug,主要原因就是由于声明为static的SortedMap<Integer, String>对象,将两个接口的VN放到了一个"一致性哈希环"上,导致某一个接口因为一致性哈希到了另一个接口上,导致NullPointer,因为负载给出的接口错了,一定是找不到方法的实现类。 不动当前结构,去掉一致性哈希实现类的所有static即可解决,只进行了简单的测试,for(100)是没有测出问题,这样的改进方法应该不是最好的,也不一定是完全没问题的。
对,这里使用static定义成类变量,导致所有的负载均衡器都共用一个map了,应该改为成员变量。 这里的负载均衡器的设计确实有些繁琐,因为每次请求都需要init,原本在设计时是打算将其包入到cache中,每次cache更新缓存时同步更新nodesMap,这样就能直接在缓存中闭环实现负载均衡的逻辑;在实现过程中发现有些麻烦,就暂且搁置了哈哈,简化成这样了
轮询负载中choose应该设置为static
https://github.com/youngyangyang04/RPC-Java/blob/a3c79b111176ab8b84151da63e715993dd126aad/version3/src/main/java/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java#L18 一致性哈希实现类,成员变量声明为static,若两个不同的主机,主机1注册一个UserServiceImpl,主机2注册一个OrderServiceImpl,如{OrderService->127.0.0.1:9999, UserService->127.0.0.1:4399},此时Client串行请求两个远程调用,有极大概率出现bug,主要原因就是由于声明为static的SortedMap<Integer, String>对象,将两个接口的VN放到了一个"一致性哈希环"上,导致某一个接口因为一致性哈希到了另一个接口上,导致NullPointer,因为负载给出的接口错了,一定是找不到方法的实现类。
不动当前结构,去掉一致性哈希实现类的所有static即可解决,只进行了简单的测试,for(100)是没有测出问题,这样的改进方法应该不是最好的,也不一定是完全没问题的。