조직 배치

Orleans는 조직 호출을 수행할 때 요청을 처리하기 위해 클러스터의 일부 서버에 있는 메모리에서 사용할 수 있는 해당 조직의 인스턴스가 있는지 확인합니다. 현재 클러스터에서 조직이 활성화되지 않은 경우 Orleans는 조직을 활성화할 서버 중 하나를 선택합니다. 이를 조직 배치라고 합니다. 배치는 부하가 분산되는 한 가지 방법이기도 합니다. 사용량이 많은 조직을 고르게 배치하면 클러스터 전체에서 워크로드를 균일하게 유지하는 데 도움이 됩니다.

Orleans의 배치 프로세스는 완전히 구성할 수 있습니다. 개발자는 임의, 선호 로컬 및 로드 기반과 같은 기본 배치 정책 세트에서 선택하거나 사용자 지정 논리를 구성할 수 있습니다. 이를 통해 조직을 만드는 위치를 유연하게 결정할 수 있습니다. 예를 들어, 조직은 작동해야 하는 리소스 또는 통신하는 다른 조직과 가까운 서버에 배치할 수 있습니다. 기본적으로 Orleans는 호환 가능한 서버를 임의로 선택합니다.

Orleans에서 사용하는 배치 전략은 전역적으로 또는 조직 클래스별로 구성될 수 있습니다.

임의 배치

서버는 클러스터의 호환 가능한 서버 중에서 임의로 선택됩니다. 이 배치 전략은 조직에 RandomPlacementAttribute를 추가하여 구성됩니다.

로컬 배치

로컬 서버가 호환되는 경우 로컬 서버를 선택하고, 그렇지 않으면 임의의 서버를 선택합니다. 이 배치 전략은 조직에 PreferLocalPlacementAttribute를 추가하여 구성됩니다.

해시 기반 배치

조직 ID를 음수가 아닌 정수로 해시하고 호환되는 서버 수를 사용하여 모듈로 처리합니다. 서버 주소로 정렬된 호환되는 서버 목록에서 해당 서버를 선택합니다. 클러스터 멤버 자격이 변경되므로 안정적인 상태를 유지하도록 보장되지는 않습니다. 특히 서버를 추가, 제거 또는 다시 시작하면 지정된 조직 ID에 대해 선택한 서버를 변경할 수 있습니다. 이 전략을 사용하여 배치된 조직은 조직 디렉터리에 등록되므로 멤버 자격 변경에 따른 배치 결정의 변경은 일반적으로 눈에 띄는 영향을 미치지 않습니다.

이 배치 전략은 조직에 HashBasedPlacementAttribute를 추가하여 구성됩니다.

활성화 개수 기반 배치

이 배치 전략은 최근 사용량이 많은 조직 수를 기반으로 부하가 가장 적은 서버에 새로운 조직 활성화를 배치하기 위한 것입니다. 여기에는 모든 서버가 정기적으로 총 활성화 수를 다른 모든 서버에 게시하는 메커니즘이 포함됩니다. 그러면 배치 디렉터가 가장 최근에 보고된 활성화 수를 검사하고 현재 서버의 배치 디렉터가 수행한 최근 활성화 수를 기반으로 현재 활성화 수를 예측하여 가장 적은 활성화가 있을 것으로 예측되는 서버를 선택합니다. 디렉터는 동일한 서버를 오버로드하는 여러 개별 서버를 방지하기 위해 이 예측을 수행할 때 여러 서버를 임의로 선택합니다. 기본적으로 두 서버는 임의로 선택되지만 이 값은 ActivationCountBasedPlacementOptions를 통해 구성할 수 있습니다.

이 알고리즘은 The Power of Two Choices in Randomized Load Balancing(Michael David Mitzenmacher)이라는 논문을 기반으로 하며, NGINX and the "Power of Two Choices" Load-Balancing Algorithm 문서에 설명된 대로 분산 부하 분산을 위해 Nginx에서도 사용됩니다.

이 배치 전략은 조직에 ActivationCountBasedPlacementAttribute를 추가하여 구성됩니다.

상태 비저장 작업자 배치

상태 비저장 작업자 배치는 상태 비저장 작업자 조직에서 사용되는 특별한 배치 전략입니다. 이 배치는 각 서버가 동일한 조직의 여러 활성화를 가질 수 있고 필요하지 않기 때문에 조직이 조직 디렉터리에 등록되지 않는다는 점을 제외하고는 PreferLocalPlacement와 거의 동일하게 작동합니다.

이 배치 전략은 조직에 StatelessWorkerAttribute를 추가하여 구성됩니다.

사일로 역할 기반 배치

특정 역할을 가진 사일로에 조직을 배치하는 결정론적 배치 전략입니다. 이 배치 전략은 조직에 SiloRoleBasedPlacementAttribute를 추가하여 구성됩니다.

배치 전략 선택

Orleans가 제공하는 기본값 외에 적절한 조직 배치 전략을 선택하려면 모니터링과 개발자 평가가 필요합니다. 배치 전략의 선택은 앱의 크기와 복잡성, 워크로드 특성 및 배포 환경을 기반으로 해야 합니다.

임의 배치는 대수의 법칙을 따르므로 일반적으로 많은 수(10,000개 이상)에 예측할 수 없는 로드가 분산되어 있는 경우 좋은 기본값입니다.

활성화 횟수를 기반으로 배치할 때 분산 부하 분산에 일반적으로 사용되는 알고리즘이고 널리 사용되는 부하 분산 장치에 사용하는 Power of Two Choices 원칙을 기반으로 하는 임의 요소도 고려합니다. 사일로는 다음을 포함하여 클러스터의 다른 사일로에 런타임 통계를 자주 게시합니다.

  • 사용 가능한 메모리, 총 실제 메모리 및 메모리 사용량입니다.
  • CPU 사용량.
  • 총 활성화 횟수 및 최근 활성 활성화 횟수입니다.
    • 지난 몇 초 동안 활성화된 활성화의 슬라이딩 윈도우이며, 활성화 작업 집합라고도 합니다.

이러한 통계에서는 현재 특정 사일로의 로드를 결정하는 데 활성화 횟수만 사용됩니다.

궁극적으로 다양한 전략을 실험하고 성과 메트릭을 모니터링하여 가장 적합한 전략을 결정해야 합니다. 올바른 조직 배치 전략을 선택하면 Orleans 앱의 성능, 확장성 및 비용 효율성을 최적화할 수 있습니다.

기본 배치 전략 구성

Orleans는 기본값이 재정의되지 않는 한 임의 배치를 사용합니다. 구성 중에 PlacementStrategy의 구현을 등록하여 기본 배치 전략을 재정의할 수 있습니다.

siloBuilder.ConfigureServices(services =>
    services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());

조직의 배치 전략 구성

조직 형식에 대한 배치 전략은 조직 클래스에 적절한 특성을 추가하여 구성됩니다. 관련 특성은 배치 전략 섹션에 지정됩니다.

샘플 사용자 지정 배치 전략

먼저 단일 메서드가 필요한 IPlacementDirector 인터페이스를 구현하는 클래스를 정의합니다. 이 예제에서는 생성하려는 조직의 Guid에 따라 사일로 번호를 반환하는 GetSiloNumber 함수가 정의되어 있다고 가정합니다.

public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
    public Task<SiloAddress> OnAddActivation(
        PlacementStrategy strategy,
        PlacementTarget target,
        IPlacementContext context)
    {
        var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
        int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);

        return Task.FromResult(silos[silo]);
    }
}

그런 다음, 조직 클래스를 전략에 할당할 수 있도록 두 개의 클래스를 정의해야 합니다.

[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
    public SamplePlacementStrategyAttribute() :
        base(new SamplePlacementStrategy())
    {
    }
}

다음으로, 특성과 함께 이 전략을 사용하려는 모든 조직 클래스에 태그를 지정하면 됩니다.

[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
    // ...
}

마지막으로 SiloHost를 빌드할 때 전략을 등록합니다.

private static async Task<ISiloHost> StartSilo()
{
    var builder = new HostBuilder(c =>
    {
        // normal configuration methods omitted for brevity
        c.ConfigureServices(ConfigureServices);
    });

    var host = builder.Build();
    await host.StartAsync();

    return host;
}

private static void ConfigureServices(IServiceCollection services)
{
    services.AddSingletonNamedService<
        PlacementStrategy, SamplePlacementStrategy>(
            nameof(SamplePlacementStrategy));

    services.AddSingletonKeyedService<
        Type, IPlacementDirector, SamplePlacementStrategyFixedSiloDirector>(
            typeof(SamplePlacementStrategy));
}

배치 컨텍스트의 추가 사용을 보여 주는 두 번째 간단한 예는 Orleans 원본 리포지토리PreferLocalPlacementDirector를 참조하세요.