algorithm - 高并发场景中带参数的负载均衡
问题描述
假设有两个服务集群A和B,即A和B都有几十或几百台主机,当然有时也可能有一些主机重启或被移除或添加。运行和。A 中的服务使用 doRemoteCall(String shopId, ..) 方法对 B 中的服务进行 RPC 调用。在高度并发的情况下,集群 qps 可能是 100k 或更多。
现在我希望 A 对 B 做 RPC 调用的负载均衡遵循以下三个规则:
具有相同 shopId 的 RPC 请求可以高概率路由到 B 上的同一主机(理想情况下)或同一组主机(当然越高越好,理想情况下可以是 100%)
RPC 调用相对均匀地分布在 B 上的主机之间。
A 上的主机中的路由决策是由每个主机独立做出的,不需要知道其他主机的信息(因为每个主机从其他主机获取信息可能很复杂,特别是在高并发和动态(主机偶尔离开或加入)的情况下) )
解决方案
神奇的谷歌词是“一致哈希”。
在经典的一致性哈希方案中,每个 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)
- 将用户标识分配给具有最小哈希值的主机。
推荐阅读
- python-3.x - 无法使用函数对列名重新排序
- php - 如何将自定义参数/属性从树枝模板传递到自定义表单字段?
- javascript - 如何从开发者控制台访问“exerciseObject”?
- python - 我正在尝试解密我的填充但只收到 1 个字符
- javascript - React:useEffect 中的昂贵计算阻塞了渲染
- sql - 时间序列数据的孤岛和缺口问题
- java - 2020-12-21T13:00:00.000+0000 的 SimpleDateFormat 掩码
- logging - 如何在 Kubernetes 集群上使用 EFK 架构访问 LoadBalancer 日志文件
- php - 我正在尝试向我的 PHP 脚本添加分页,但它不起作用并且总是显示 HTTP 错误 500
- c# - 通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb