Orleans 그레인 디렉터리

조직은 안정적인 논리적 ID를 가지고 있으며 애플리케이션의 수명 동안 여러 번 활성화되고(인스턴스화) 비활성화될 수 있지만, 어느 시점에 최대 1번의 조직 활성화가 존재합니다. 조직이 활성화될 때마다 클러스터의 다른 사일로에 배치될 수 있습니다. 클러스터에서 조직이 활성화되면 전역 레지스트리인 조직 디렉터리에 등록됩니다. 그러면 해당 조직의 후속 호출이 조직의 활성화로 전달되고 해당 조직의 다른 활성화(인스턴스)가 생성되지 않습니다. 조직 디렉터리는 조직 ID와 현재 활성화 위치(사일로) 간의 매핑을 유지합니다.

기본적으로 Orleans는 기본 제공 분산 메모리 내 디렉터리를 사용합니다. 이 디렉터리는 결국 분산 해시 테이블 형태로 클러스터의 모든 사일로에 걸쳐 일관되고 분할됩니다.

3.2.0부터 Orleans는 그레인 디렉터리의 플러그형 구현도 지원합니다.

이러한 두 플러그 인은 3.2.0 릴리스에 포함됩니다.

조직별 형식 기준으로 사용할 조직 디렉터리 구현을 구성할 수 있으며 구현을 삽입할 수도 있습니다.

어떤 조직 디렉터리를 사용해야 하나요?

항상 기본값(기본 제공 메모리 내 분산 디렉터리)으로 시작하는 것이 좋습니다. 결국 일관성 있게 유지되고, 클러스터가 불안정할 때 때때로 중복 활성화를 허용하지만, 기본 제공 디렉터리는 외부 종속성 없이 자체적으로 충분하며 구성이 필요하지 않고 운영 환경에서 내내 사용되어 왔습니다.

Orleans에 대한 경험이 있고 더 강력한 단일 활성화 보장이 있는 그레인 디렉터리 사용 사례가 있는 경우 및/또는 클러스터의 사일로가 종료될 때 비활성화되는 그레인 수를 최소화하려는 경우 Redis 구현과 같은 그레인 디렉터리의 스토리지 기반 구현을 사용하는 것이 좋습니다. 수명이 길고, 상태의 양이 많거나 비용이 많이 드는 초기화 프로세스가 있는 조직 형식부터 시작하여 하나 또는 몇 가지 조직 형식에 먼저 사용해 보세요.

구성

기본적으로 사용자는 아무것도 수행할 필요가 없습니다. 메모리 내 조직 디렉터리가 클러스터 전체에서 자동으로 사용되고 분할됩니다. 기본값이 아닌 조직 디렉터리 구성을 사용하려면 사용할 디렉터리 플러그 인의 이름을 지정해야 합니다. 이는 조직 클래스의 특성을 통해, 사일로 구성 중 종속성 주입 및 해당 이름의 디렉터리 플러그 인을 통해 수행될 수 있습니다.

조직 구성

GrainDirectoryAttribute를 사용하여 조직 디렉터리 플러그 인 이름을 지정합니다.

[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
    // ...
}

사일로 구성

여기서는 Redis 조직 디렉터리 구현을 구성합니다.

siloBuilder.AddRedisGrainDirectory(
    "my-grain-directory",
    options => options.ConfigurationOptions = redisConfiguration);

Azure 조직 디렉터리가 다음과 같이 구성됩니다.

siloBuilder.AddAzureTableGrainDirectory(
    "my-grain-directory",
    options => options.ConnectionString = azureConnectionString);

서로 다른 이름을 가진 여러 디렉터리를 구성하여 다른 조직 클래스에 사용할 수 있습니다.

siloBuilder
    .AddRedisGrainDirectory(
        "redis-directory-1",
        options => options.ConfigurationOptions = redisConfiguration1)
    .AddRedisGrainDirectory(
        "redis-directory-2",
        options => options.ConfigurationOptions = redisConfiguration2)
    .AddAzureTableGrainDirectory(
        "azure-directory",
        options => options.ConnectionString = azureConnectionString);