高并发场景下带参数的跨集群RPC调用负载均衡方案咨询
适配要求的RPC负载均衡策略实现方案
本方案基于带虚拟节点的一致性哈希算法实现,完全匹配题中三个核心要求,且可支撑10万+QPS的高并发场景,具体设计如下:
核心设计匹配逻辑
- 匹配要求1(同shopId高概率固定路由):对入参
shopId做哈希运算后映射到一致性哈希环的固定位置,顺时针查找最近的集群B节点,只要B集群无节点变动,同shopId的请求100%路由到同一节点;出现节点上下线、重启时,仅环上相邻位置的少量shopId会发生路由漂移,远低于普通哈希取模的N/N(N为节点数)漂移率,满足极高概率固定路由的要求。 - 匹配要求2(流量均匀分布):为每个B集群物理节点配置100~200个虚拟节点,虚拟节点统一映射到对应物理节点,打散哈希环上的节点分布,避免物理节点哈希值扎堆导致的流量倾斜,实测虚拟节点数≥100时,100节点规模的集群流量分布偏差可控制在5%以内,满足均匀分布要求。
- 匹配要求3(A节点独立无同步):每个A集群节点本地独立维护B集群的可用节点列表缓存,仅需向服务注册中心订阅B集群的节点变更事件异步更新本地缓存即可,不需要和其他A节点做任何信息同步,完全去中心化,无跨节点同步开销,路由计算为纯内存操作,性能无瓶颈。
具体落地实现步骤
本地节点列表维护
每个A服务实例启动时,先从注册中心拉取全量的B集群可用节点列表存入本地内存,同时注册B集群的节点变更监听器,B节点上下线、重启时异步更新本地列表,保证本地列表的最终一致性。一致性哈希环构建
每次本地B节点列表更新时,后台异步重建哈希环:
- 选择高性能、分布均匀的哈希算法,推荐MurmurHash3,避免使用Java原生hashCode这类分布不均的算法
- 每个物理节点生成N个虚拟节点,命名规则为
{B节点IP}:{端口}#vn{序号},计算每个虚拟节点的哈希值后存入有序哈希环结构(比如Java的TreeMap),同时存储虚拟节点到物理节点的映射关系。
- 路由计算逻辑
每次调用doRemoteCall方法时,执行如下路由计算:
// 计算shopId对应的哈希值 long shopHash = MurmurHash3.hash32(shopId.getBytes(StandardCharsets.UTF_8)); // 查找哈希环上第一个大于等于当前哈希值的虚拟节点 SortedMap<Long, String> tailMap = hashRing.tailMap(shopHash); String targetVNode = tailMap.isEmpty() ? hashRing.get(hashRing.firstKey()) : tailMap.get(tailMap.firstKey()); // 映射到物理节点后发起RPC调用 String targetBNode = vNodeToPhysicsMap.get(targetVNode);
- 可选优化
如果需要进一步降低节点变动时的路由漂移率,可按机房/机架给B节点打分组标签,每个shopId固定映射到2~3个B节点组成的小分组,调用失败时自动重试同分组内的其他节点,既保证同shopId的请求始终在固定分组内,又能提升调用可用性。
方案性能&效果验证
- 性能:纯内存运算,单实例单次路由计算耗时小于1μs,无额外网络开销,完全支撑10万+QPS的高并发场景
- 路由固定率:B集群无节点变动时同shopId路由固定率100%;单节点下线时仅约1/N(N为B集群节点数)的shopId发生漂移,符合极高概率固定路由要求
- 流量均匀性:虚拟节点数设置为200时,100节点规模的B集群流量分布偏差不超过3%,满足均匀分布要求
内容的提问来源于stack exchange,提问作者lily
相关产品推荐
相关产品推荐

