서버 구성
사일로는 UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) 확장 메서드 및 여러 추가 옵션 클래스를 사용하여 프로그래밍 방식으로 구성됩니다. Orleans의 옵션 클래스는 .NET의 옵션 패턴을 따르며 파일, 환경 변수 또는 기타 유효한 구성 공급자를 통해 로드할 수 있습니다.
사일로 구성에는 다음과 같은 몇 가지 주요 측면이 있습니다.
- 클러스터링 공급자
- (선택 사항) Orleans 클러스터링 정보
- (선택 사항) 사일로-사일로 및 클라이언트-사일로 통신에 사용할 엔드포인트
다음은 클러스터 정보를 정의하고, Azure 클러스터링을 사용하고, 애플리케이션 파트를 구성하는 사일로 구성의 예입니다.
using IHost host = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString));
})
.UseConsoleLifetime()
.Build();
팁
Orleans를 개발할 때 UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String)을 호출하여 로컬 클러스터를 구성할 수 있습니다. 프로덕션 환경에서는 배포에 적합한 클러스터링 공급자를 사용해야 합니다.
클러스터링 공급자
siloBuilder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString))
일반적으로 Orleans에 빌드된 서비스는 전용 하드웨어 또는 클라우드의 노드 클러스터에 배포됩니다. 개발 및 기본 테스트를 위해 Orleans를 단일 노드 구성으로 배포할 수 있습니다. 노드 클러스터에 배포되면 Orleans는 노드 오류 검색 및 자동 다시 구성을 포함하여 클러스터에서 Orleans 사일로의 멤버 자격을 검색하고 유지하기 위한 프로토콜 집합을 내부적으로 구현합니다.
클러스터 멤버 자격을 안정적으로 관리하기 위해 Orleans는 노드 동기화에 Azure Table, SQL Server 또는 Apache ZooKeeper를 사용합니다.
이 샘플에서는 멤버 자격 공급자로 Azure Table을 사용합니다.
Orleans 클러스터링 정보
필요에 따라 클러스터링을 구성하려면 ClusterOptions
를 ISiloBuilder
인스턴스에서 Configure 메서드의 형식 매개 변수로 사용합니다.
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
})
여기서는 두 가지 옵션을 지정합니다.
ClusterId
를"my-first-cluster"
로 설정합니다. 이는 Orleans 클러스터의 고유 ID입니다. 이 ID를 사용하는 모든 클라이언트와 사일로는 서로 직접 통신할 수 있습니다. 하지만 다른 배포에 다른ClusterId
를 사용하도록 선택할 수 있습니다.ServiceId
를"SampleApp"
으로 설정: 지속성 공급자와 같은 일부 공급자에서 사용할 애플리케이션에 대한 고유 ID입니다. 이 ID는 안정적으로 유지되어야 하며 배포 간에 변경되지 않아야 합니다.
기본적으로 Orleans는 ServiceId
및 ClusterId
모두에 대해 "default"
값을 사용합니다. 대부분의 경우 이러한 값을 변경할 필요가 없습니다. ServiceId
는 둘 중 더 중요하며 서로 간섭하지 않고 백 엔드 스토리지 시스템을 공유할 수 있도록 서로 다른 논리적 서비스를 구분하는 데 사용됩니다. ClusterId
는 어떤 호스트가 서로 연결되어 클러스터를 형성할지 결정하는 데 사용됩니다.
각 클러스터 내에서 모든 호스트는 동일한 ServiceId
를 사용해야 합니다. 그러나 여러 클러스터가 ServiceId
를 공유할 수 있습니다. 이를 통해 다른 배포(클러스터)가 종료되기 전에 새 배포(클러스터)가 시작되는 파란색/녹색 배포 시나리오가 가능해집니다. 이는 Azure App Service에서 호스트되는 시스템에 일반적입니다.
ServiceId
및 ClusterId
가 애플리케이션 수명 동안 고정된 상태로 유지되고 롤링 배포 전략이 사용되는 것이 더 일반적입니다. 이는 Kubernetes 및 Service Fabric에서 호스트되는 시스템에 일반적입니다.
엔드포인트
기본적으로 Orleans는 사일로-사일로 통신에 대해 포트 11111
, 클라이언트-사일로 통신에 대해 포트 30000
에서 모든 인터페이스를 수신 대기합니다. 이 동작을 재정의하려면 ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean)를 호출하고 사용하려는 포트 번호를 전달합니다.
siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)
위의 코드에서
- 사일로 포트는
17_256
으로 설정됩니다. - 게이트웨이 포트는
34_512
로 설정됩니다.
Orleans 사일로에는 두 가지 일반적인 엔드포인트 구성 형식이 있습니다.
- 사일로-사일로 엔드포인트는 동일한 클러스터의 사일로 간 통신에 사용됩니다.
- 클라이언트-사일로(또는 게이트웨이) 엔드포인트는 동일한 클러스터의 클라이언트 및 사일로 간 통신에 사용됩니다.
이 메서드는 대부분의 경우 충분해야 하지만 필요한 경우 추가로 사용자 지정할 수 있습니다. 다음은 일부 포트 전달과 함께 외부 IP 주소를 사용하는 방법의 예입니다.
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11_111;
// Port to use for the gateway
options.GatewayPort = 30_000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40_000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50_000);
})
내부적으로 사일로는 0.0.0.0:40000
및 0.0.0.0:50000
을 수신 대기하지만 멤버 자격 공급자에 게시된 값은 172.16.0.42:11111
및 172.16.0.42:30000
이 됩니다.
사일로는 SiloHostBuilder 및 여러 추가 옵션 클래스를 통해 프로그래밍 방식으로 구성됩니다. Orleans의 옵션 클래스는 .NET의 옵션 패턴을 따르며 파일, 환경 변수 또는 기타 유효한 구성 공급자를 통해 로드할 수 있습니다.
사일로 구성에는 다음과 같은 몇 가지 주요 측면이 있습니다.
- Orleans 클러스터링 정보
- 클러스터링 공급자
- 사일로-사일로 및 클라이언트-사일로 통신에 사용할 엔드포인트
- 애플리케이션 파트
다음은 클러스터 정보를 정의하고, Azure 클러스터링을 사용하고, 애플리케이션 파트를 구성하는 사일로 구성의 예입니다.
var silo = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder
.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
.ConfigureApplicationParts(
parts => parts.AddApplicationPart(typeof(ValueGrain).Assembly).WithReferences())
})
.UseConsoleLifetime()
.Build();
이 샘플에 사용된 단계를 자세히 살펴보겠습니다.
클러스터링 공급자
siloBuilder.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
일반적으로 Orleans에 빌드된 서비스는 전용 하드웨어 또는 클라우드의 노드 클러스터에 배포됩니다. 개발 및 기본 테스트를 위해 Orleans를 단일 노드 구성으로 배포할 수 있습니다. 노드 클러스터에 배포되면 Orleans는 노드 오류 검색 및 자동 다시 구성을 포함하여 클러스터에서 Orleans 사일로의 멤버 자격을 검색하고 유지하기 위한 프로토콜 집합을 내부적으로 구현합니다.
클러스터 멤버 자격을 안정적으로 관리하기 위해 Orleans는 노드 동기화에 Azure Table, SQL Server 또는 Apache ZooKeeper를 사용합니다.
이 샘플에서는 멤버 자격 공급자로 Azure Table을 사용하고 있습니다.
Orleans 클러스터링 정보
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
여기서는 다음 두 가지 작업을 수행합니다.
ClusterId
를"my-first-cluster"
로 설정합니다. 이는 Orleans 클러스터의 고유 ID입니다. 이 ID를 사용하는 모든 클라이언트와 사일로는 서로 직접 통신할 수 있습니다. 하지만 다른 배포에 다른ClusterId
를 사용하도록 선택할 수 있습니다.ServiceId
를"AspNetSampleApp"
으로 설정: 지속성 공급자와 같은 일부 공급자에서 사용할 애플리케이션에 대한 고유 ID입니다. 이 ID는 안정적으로 유지되어야 하며 배포 간에 변경되지 않아야 합니다.
기본적으로 Orleans는 ServiceId
및 ClusterId
모두에 대해 "default"
값을 사용합니다. 대부분의 경우 이러한 값을 변경할 필요가 없습니다. ServiceId
는 둘 중 더 중요하며 서로 간섭하지 않고 백 엔드 스토리지 시스템을 공유할 수 있도록 서로 다른 논리적 서비스를 구분하는 데 사용됩니다. ClusterId
는 어떤 호스트가 서로 연결되어 클러스터를 형성할지 결정하는 데 사용됩니다.
각 클러스터 내에서 모든 호스트는 동일한 ServiceId
를 사용해야 합니다. 그러나 여러 클러스터가 ServiceId
를 공유할 수 있습니다. 이를 통해 다른 배포(클러스터)가 종료되기 전에 새 배포(클러스터)가 시작되는 파란색/녹색 배포 시나리오가 가능해집니다. 이는 Azure App Service에서 호스트되는 시스템에 일반적입니다.
ServiceId
및 ClusterId
가 애플리케이션 수명 동안 고정된 상태로 유지되고 롤링 배포 전략이 사용되는 것이 더 일반적입니다. 이는 Kubernetes 및 Service Fabric에서 호스트되는 시스템에 일반적입니다.
엔드포인트
siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
Orleans 사일로에는 두 가지 일반적인 엔드포인트 구성 형식이 있습니다.
- 사일로-사일로 엔드포인트: 동일한 클러스터의 사일로 간 통신에 사용됨
- 클라이언트-사일로 엔드포인트(또는 게이트웨이): 동일한 클러스터의 클라이언트 및 사일로 간 통신에 사용됨
샘플에서는 사일로-사일로 통신에 사용되는 포트를 11111
로 설정하고 게이트웨이에 대한 포트를 30000
으로 설정하는 도우미 메서드 .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
를 사용합니다.
이 메서드는 수신 대기할 인터페이스를 검색합니다.
이 메서드는 대부분의 경우 충분해야 하지만 필요한 경우 추가로 사용자 지정할 수 있습니다. 다음은 일부 포트 전달과 함께 외부 IP 주소를 사용하는 방법의 예입니다.
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11111;
// Port to use for the gateway
options.GatewayPort = 30000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000);
})
내부적으로 사일로는 0.0.0.0:40000
및 0.0.0.0:50000
을 수신 대기하지만 멤버 자격 공급자에 게시된 값은 172.16.0.42:11111
및 172.16.0.42:30000
이 됩니다.
애플리케이션 파트
siloBuilder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(
typeof(ValueGrain).Assembly)
.WithReferences())
이 단계는 기술적으로 필요하지는 않지만(구성되지 않은 경우 Orleans는 현재 폴더의 모든 어셈블리를 검사합니다) 개발자는 이를 구성하는 것이 좋습니다. 이 단계는 Orleans가 사용자 어셈블리 및 형식을 로드하는 데 도움이 됩니다. 이러한 어셈블리를 애플리케이션 파트라고 합니다. 모든 조직, 조직 인터페이스 및 직렬 변환기는 애플리케이션 파트를 사용하여 검색됩니다.
애플리케이션 파트는 IClientBuilder 및 ISiloHostBuilder에서 ConfigureApplicationParts
확장 메서드를 사용하여 액세스할 수 있는 IApplicationPartManager를 사용하여 구성됩니다. ConfigureApplicationParts
메서드는 대리자인 Action<IApplicationPartManager>
를 허용합니다.
IApplicationPartManager의 다음 확장 메서드가 일반적인 용도를 지원합니다.
- ApplicationPartManagerExtensions.AddApplicationPart 확장 메서드를 사용하여 단일 어셈블리를 추가할 수 있습니다.
- ApplicationPartManagerExtensions.AddFromAppDomain은
AppDomain
에서 현재 로드된 모든 어셈블리를 추가합니다. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory는 현재 기본 경로의 모든 어셈블리를 로드하고 추가합니다(AppDomain.BaseDirectory 참조).
위의 메서드로 추가한 어셈블리는 반환 형식 IApplicationPartManagerWithAssemblies에서 다음 확장 메서드를 사용하여 보완할 수 있습니다.
- ApplicationPartManagerExtensions.WithReferences는 추가된 파트에서 참조된 모든 어셈블리를 추가합니다. 이렇게 하면 전이적으로 참조된 어셈블리가 즉시 로드됩니다. 어셈블리 로드 오류는 무시됩니다.
- ApplicationPartManagerCodeGenExtensions.WithCodeGeneration는 추가된 파트에 대한 지원 코드를 생성하고 파트 관리자에 추가합니다. 이렇게 하려면
Microsoft.Orleans.OrleansCodeGenerator
패키지를 설치해야 하며 이러한 과정을 일반적으로 런타임 코드 생성이라고 합니다.
형식 검색을 수행하려면 제공된 애플리케이션 파트에 특정 특성이 포함되어야 합니다. 조직, 조직 인터페이스 또는 직렬 변환기가 포함된 각 프로젝트에 빌드 시간 코드 생성 패키지(Microsoft.Orleans.CodeGenerator.MSBuild
또는 Microsoft.Orleans.OrleansCodeGenerator.Build
)를 추가하는 것은 이러한 특성이 있는지 확인하는 데 권장되는 접근 방법입니다. 빌드 시간 코드 생성은 C#만 지원합니다. F#, Visual Basic 및 기타 .NET 언어의 경우 위에서 설명한 WithCodeGeneration 메서드를 통해 구성 시간 동안 코드를 생성할 수 있습니다. 코드 생성에 대한 자세한 내용은 해당 섹션에서 확인할 수 있습니다.
.NET