思考
就是同一个服务要部署多个节点,然后一个请求任务过来,那么这个请求分发给哪个服务呢
工程的优化演进
1、最简单的循环调用
2、按人工标记的权重轮询
3、用 指数加权移动平均 来预测服务延迟曲线,把请求分发给延迟最小的服务节点
EWMA exponentially weighted moving average
https://blog.buoyant.io/2016/03/16/beyond-round-robin-load-balancing-for-latency/
预测服务各节点的延时,并与未完成请求数加权,再选择消耗成本最低的服务节点
因为每台机器的性能不同,简单的 round robin 只是平均的把服务丢到各个服务,或者统计每个节点未完成请求数,选择最小那个。
如果加上EWMA预测延时的算法,就更好做负载均衡了
避免了人工标记权重的主观性(像 nignx 的 weight round robin),由算法来预测各个节点的延时曲线,在不同机器性能与网络带来负载能力差异下,更有针对性的分发请求到各个节点