首页 > 解决方案 > 高并发场景中带参数的负载均衡

问题描述

假设有两个服务集群A和B,即A和B都有几十或几百台主机,当然有时也可能有一些主机重启或被移除或添加。运行和。A 中的服务使用 doRemoteCall(String shopId, ..) 方法对 B 中的服务进行 RPC 调用。在高度并发的情况下,集群 qps 可能是 100k 或更多。

现在我希望 A 对 B 做 RPC 调用的负载均衡遵循以下三个规则:

  1. 具有相同 shopId 的 RPC 请求可以高概率路由到 B 上的同一主机(理想情况下)或同一组主机(当然越高越好,理想情况下可以是 100%)

  2. RPC 调用相对均匀地分布在 B 上的主机之间。

  3. A 上的主机中的路由决策是由每个主机独立做出的,不需要知道其他主机的信息(因为每个主机从其他主机获取信息可能很复杂,特别是在高并发和动态(主机偶尔离开或加入)的情况下) )

标签: algorithmload-balancing

解决方案


神奇的谷歌词是“一致哈希”。

在经典的一致性哈希方案中,每个 A 主机都会这样做(常量 256 和 64 位是任意的,但适合这个问题的大小):

  • 对于每个主机 B 和 1...256 中的所有 k,计算一个 64 位服务器哈希 H s = hash(B,k)
  • 对于每个用户 id,计算一个 64 位哈希 H u
  • 将用户 id 分配给具有最小 H s的主机,使得 H s >= H u。如果没有,请使用最高的 H s

当然,服务器散列的集合只需要在 B 主机上电或下电时进行修改。

我通常更喜欢会合散列,但是要平衡数百台主机,它会变得很慢:

  • 对于每个用户 id,对于每个主机,计算一个 64 位哈希(userid,host)
  • 将用户标识分配给具有最小哈希值的主机。

推荐阅读