负载均衡

    因为它在 RPC 层上运行,所以 linkerd 可以根据观察到的 RPC 延迟和队列大小来平衡负载,而不是启发式如 LRU 或 TCP 活动。这意味着它可以优化流量并减少整个应用程序的尾部延迟。因为 linkerd 构建在 Finagle 之上,所以它可以利用各种负载均衡算法,目标是最大化成功处理的请求数量,同时最小化延迟。

    以下描述了 linkerd 中可用的负载均衡算法。Finagle 的 负载均衡 文档中也将对它们进行更详细的介绍。

    这是 linkerd 的默认负载均衡器,非常简单。当确定发送请求的位置时,linkerd 随机从负载均衡器池中选择两个副本,并选择两者中最少负载的副本。负载由每个副本的未完成请求数决定。该算法为单个副本提供了可管理的负载上限,与具有相似性能的其他算法相比,开销较少。

    此负载均衡器是 策略的变体,因为它在发送请求时仍然在两个副本之间进行选择。为了做出这个决定,它保持观察到的延迟的动态平均值,并且使用它来对每个副本的未完成请求的数量进行加权。这种方法对延迟波动更敏感,并通过向较慢的后端发送更少的请求来允许他们恢复时间。延迟窗口是可配置的。

    这个负载均衡器使用最小堆来跟踪所有副本的未完成请求数。它将所有请求发送到堆中的顶端的副本,这是在请求时负载最少的,并将随时间而更改。这种方法的一个显著限制是堆是所有请求的共享资源,因此大流量时会导致争用问题。

    轮询负载均衡器假设所有副本处理性能均相同,不管服务器的当前连接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮询调度算法容易导致服务器间的负载不平衡。