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
"ReverseProxy": {
"Clusters": {
"cluster1": {
"LoadBalancingPolicy": "RoundRobin",
"Destinations": {
"cluster1/destination1": {
"Address": "https://localhost:10000/"
},
"cluster1/destination2": {
"Address": "https://localhost:10010/"
}
}
}
}
}Ví dụ code
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:
FirstAlphabetical
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.
Random
Chọn destination một cách ngẫu nhiên.
PowerOfTwoChoices(mặc định)
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.
RoundRobin
Chọn destination bằng cách lặp qua chúng theo thứ tự.
LeastRequests
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.
// 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";