다음을 통해 공유


YARP 부하 분산

소개

사용 가능한 정상 대상이 여러 개 있을 때, YARP는 특정 요청에 사용할 대상을 결정해야 합니다. YARP는 기본 제공 부하 분산 알고리즘과 함께 제공되지만 사용자 지정 부하 분산 방법에 대한 확장성도 제공합니다.

구성

서비스 및 미들웨어 등록

부하 분산 정책은 AddLoadBalancingPolicies()자동으로 호출되는 AddReverseProxy() 메서드를 통해 DI 컨테이너에 등록됩니다.

미들웨어는 매개 변수가 없는 UseLoadBalancing() 메서드에 기본적으로 포함된 MapReverseProxy와 함께 추가됩니다.

클러스터 구성

대상을 결정하는 데 사용되는 알고리즘은 LoadBalancingPolicy설정하여 구성할 수 있습니다.

정책을 지정하지 않으면 PowerOfTwoChoices 사용됩니다.

파일 예제

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

코드 예제

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" } }
        }
    }
};

기본 제공 정책

YARP는 다음과 같은 기본 제공 정책을 제공합니다.

  • FirstAlphabetical

부하를 고려하지 않고 사용할 수 있는 대상 중 사전순으로 첫 번째를 선택합니다. 이중 대상 장애 조치 시스템에 유용합니다.

  • Random

대상을 임의로 선택합니다.

  • PowerOfTwoChoices(기본값)

두 개의 임의 대상을 선택한 다음, 최소 할당된 요청이 있는 대상을 선택합니다. 이렇게 하면 LeastRequests의 오버헤드를 방지하고, Random의 경우에는 바쁜 대상을 선택하는 최악의 상황을 피할 수 있습니다.

  • RoundRobin

순서대로 순환하여 대상을 선택합니다.

  • LeastRequests

할당된 요청이 가장 적은 대상을 선택합니다. 이를 위해 모든 목적지를 검토해야 합니다.

확장성

ILoadBalancingPolicy의 역할은 사용 가능한 정상적인 대상 목록에서 목적지를 선택하는 것입니다.

DI에서 사용자 지정 구현을 제공할 수 있습니다.

// Implement the ILoadBalancingPolicy
public sealed class LastLoadBalancingPolicy : ILoadBalancingPolicy
{
    public string Name => "Last";

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

// Register it in DI in ConfigureServices method
services.AddSingleton<ILoadBalancingPolicy, LastLoadBalancingPolicy>();

// Set the LoadBalancingPolicy on the cluster
cluster.LoadBalancingPolicy = "Last";