Nguon: Microsoft Learn · .NET 8.0

YARP — Cân bằng tải (Load Balancing)

Nguồn: YARP Load Balancing

Giới thiệu

Bất cứ khi nào có nhiều destination (điểm đến) lành mạnh, YARP phải quyết định sẽ sử dụng destination nào cho một request nhất định. YARP đi kèm với các thuật toán cân bằng tải tích hợp sẵn, nhưng cũng cung cấp khả năng mở rộng cho bất kỳ phương pháp cân bằng tải tùy chỉnh nào.

Cấu hình

Đăng ký services và middleware

Các policy (chính sách) cân bằng tải được đăng ký trong DI container (bộ chứa DI) thông qua phương thức AddLoadBalancingPolicies(), được AddReverseProxy() tự động gọi.

Middleware được thêm bằng UseLoadBalancing(), được bao gồm mặc định trong phương thức MapReverseProxy không có tham số.

Cấu hình Cluster

Thuật toán được dùng để xác định destination có thể được cấu hình bằng cách đặt LoadBalancingPolicy.

Nếu không có policy được chỉ định, PowerOfTwoChoices sẽ được sử dụng.

Ví dụ file cấu hình

json
"ReverseProxy": {
  "Clusters": {
    "cluster1": {
      "LoadBalancingPolicy": "RoundRobin",
      "Destinations": {
        "cluster1/destination1": {
          "Address": "https://localhost:10000/"
        },
        "cluster1/destination2": {
          "Address": "https://localhost:10010/"
        }
      }
    }
  }
}

Ví dụ code

csharp
var clusters = new[]
{
    new ClusterConfig()
    {
        ClusterId = "cluster1",
        LoadBalancingPolicy = LoadBalancingPolicies.RoundRobin,
        Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
        {
            { "destination1", new DestinationConfig() { Address = "https://localhost:10000" } },
            { "destination2", new DestinationConfig() { Address = "https://localhost:10010" } }
        }
    }
};

Policy tích hợp sẵn

YARP đi kèm với các policy tích hợp sẵn sau:

Chọn destination lành mạnh đầu tiên theo thứ tự bảng chữ cái mà không xét đến tải. Hữu ích cho các hệ thống chuyển đổi dự phòng (fail-over) hai destination.

Chọn destination một cách ngẫu nhiên.

Chọn hai destination ngẫu nhiên rồi chọn destination nào có ít request được gán hơn. Điều này tránh overhead của LeastRequests và trường hợp xấu nhất của Random khi nó chọn một destination bận.

Chọn destination bằng cách lặp qua chúng theo thứ tự.

Chọn destination có ít request được gán nhất. Điều này yêu cầu kiểm tra tất cả destination.

Khả năng mở rộng (Extensibility)

ILoadBalancingPolicy chịu trách nhiệm chọn một destination từ danh sách các destination lành mạnh có sẵn.

Một triển khai tùy chỉnh có thể được cung cấp trong DI.

csharp
// Triển khai ILoadBalancingPolicy
public sealed class LastLoadBalancingPolicy : ILoadBalancingPolicy
{
    public string Name => "Last";

    public DestinationState? PickDestination(HttpContext context, ClusterState cluster, IReadOnlyList<DestinationState> availableDestinations)
    {
        return availableDestinations[^1];
    }
}

// Đăng ký trong DI trong phương thức ConfigureServices
services.AddSingleton<ILoadBalancingPolicy, LastLoadBalancingPolicy>();

// Đặt LoadBalancingPolicy trên cluster
cluster.LoadBalancingPolicy = "Last";