곡물 기능을 지원하는 원격으로 액세스할 수 있는 분할된 서비스입니다. 곡물 서비스의 각 인스턴스는 일부 곡물 집합을 담당합니다. 이러한 곡물은 현재 서비스를 담당하는 곡물 서비스에 대한 참조를 얻을 수 있습니다 GrainServiceClient
.
곡물 서비스는 Orleans 클러스터를 중심으로 곡물 처리에 대한 책임이 분산되어야 하는 경우를 지원하기 위해 존재합니다. 예를 들어 Orleans 미리 알림은 그레인 서비스를 사용하여 구현됩니다. 각 사일로는 그레인의 하위 집합에 대한 미리 알림 작업을 처리하고 미리 알림이 발동되면 해당 그레인을 알립니다.
사일로에서 곡물 서비스를 구성합니다. 사일로가 시작될 때 초기화되며, 이는 사일로 자체가 초기화를 완료하기 전입니다. 유휴 상태일 때 수집되지 않습니다. 대신, 그들의 수명은 사일로 자체의 수명 동안 연장됩니다.
곡물 서비스 만들기
A GrainService 는 특별한 특성을 가진 곡물로, 고정된 정체성이 없으며 모든 사일로에서 시작부터 종료까지 작동됩니다. IGrainService 인터페이스를 구현하는 것은 몇 가지 단계가 포함됩니다.
조직 서비스 통신 인터페이스를 정의합니다. 곡물 인터페이스를 구성할 때 사용하는 것과 동일한 원칙을 사용하여
GrainService
의 인터페이스를 구축하십시오.public interface IDataService : IGrainService { Task MyMethod(); }
DataService
조직 서비스를 만듭니다. IGrainFactory을(를) 주입하여GrainService
에서 작은 작업 호출을 할 수 있다는 것을 아는 것이 유용합니다.[Reentrant] public class DataService : GrainService, IDataService { readonly IGrainFactory _grainFactory; public DataService( IServiceProvider services, GrainId id, Silo silo, ILoggerFactory loggerFactory, IGrainFactory grainFactory) : base(id, silo, loggerFactory) { _grainFactory = grainFactory; } public override Task Init(IServiceProvider serviceProvider) => base.Init(serviceProvider); public override Task Start() => base.Start(); public override Task Stop() => base.Stop(); public Task MyMethod() { // TODO: custom logic here. return Task.CompletedTask; } }
[Reentrant] public class DataService : GrainService, IDataService { readonly IGrainFactory _grainFactory; public DataService( IServiceProvider services, IGrainIdentity id, Silo silo, ILoggerFactory loggerFactory, IGrainFactory grainFactory) : base(id, silo, loggerFactory) { _grainFactory = grainFactory; } public override Task Init(IServiceProvider serviceProvider) => base.Init(serviceProvider); public override Task Start() => base.Start(); public override Task Stop() => base.Stop(); public Task MyMethod() { // TODO: custom logic here. return Task.CompletedTask; } }
다른 곡물이 GrainServiceClient<TGrainService>에 연결하는 데 사용할 인터페이스를
GrainServiceClient
GrainService
에 만듭니다.public interface IDataServiceClient : IGrainServiceClient<IDataService>, IDataService { }
조직 서비스 클라이언트를 만듭니다. 클라이언트는 일반적으로 대상 서비스의 프록시 역할을 하므로 일반적으로 대상 서비스의 각 메서드에 대한 메서드를 추가합니다. 이러한 메서드는 대상 곡물 서비스에 대한 참조를 가져와서 호출할 수 있어야 합니다. 기본 클래스는
GrainServiceClient<T>
메서드의 여러 오버로드를 제공하여GetGrainService
, 숫자 해시(GrainId
), 또는uint
에 해당하는 그레인 참조를 반환할 수 있습니다. 후자의 두 오버로드는 다른 메커니즘을 사용하여 호스트에 책임을 매핑하거나 호스트를 직접 처리하려는 고급 사례에 대한 것입니다. 아래 샘플 코드에서는GrainService
라는 속성을 정의합니다. 이 속성은IDataService
를 호출하는 곡물의DataServiceClient
을 반환합니다. 이를 위해GetGrainService(GrainId)
속성과 함께CurrentGrainReference
오버로드를 사용합니다.public class DataServiceClient : GrainServiceClient<IDataService>, IDataServiceClient { public DataServiceClient(IServiceProvider serviceProvider) : base(serviceProvider) { } // For convenience when implementing methods, you can define a property which gets the IDataService // corresponding to the grain which is calling the DataServiceClient. private IDataService GrainService => GetGrainService(CurrentGrainReference.GrainId); public Task MyMethod() => GrainService.MyMethod(); }
조직 서비스 클라이언트를 필요로 하는 다른 조직에 삽입합니다. 로컬 사일로에서
GrainServiceClient
에 대한GrainService
의 액세스가 보장되지 않습니다. 클러스터의 모든 사일로에 있는GrainService
에 명령을 보낼 수 있습니다.public class MyNormalGrain: Grain<NormalGrainState>, INormalGrain { readonly IDataServiceClient _dataServiceClient; public MyNormalGrain( IGrainActivationContext grainActivationContext, IDataServiceClient dataServiceClient) => _dataServiceClient = dataServiceClient; }
사일로에서 조직 서비스 및 조직 서비스 클라이언트를 구성합니다. 사일로가 작동하도록 이 작업을 수행해야 합니다
GrainService
.(ISiloHostBuilder builder) => builder.ConfigureServices( services => services.AddGrainService<DataService>() .AddSingleton<IDataServiceClient, DataServiceClient>());
추가적인 참고 사항
곡물 서비스를 등록하는 데 사용되는 확장 메서드 GrainServicesSiloBuilderExtensions.AddGrainService가 있습니다.
services.AddSingleton<IGrainService>(
serviceProvider => GrainServiceFactory(grainServiceType, serviceProvider));
사일로는 시작할 때 서비스 공급자에서 IGrainService
형식을 가져옵니다 (참조: orleans/src/Orleans.Runtime/Silo/Silo.cs).
var grainServices = this.Services.GetServices<IGrainService>();
Microsoft.Orleans.Runtime NuGet 패키지는 GrainService
프로젝트에서 참조되어야 합니다.
Microsoft.Orleans.OrleansRuntime NuGet 패키지는 GrainService
프로젝트에서 참조해야 합니다.
이렇게 하려면 서비스와 해당 클라이언트를 모두 등록해야 합니다. 코드는 다음과 같습니다.
var builder = new HostBuilder()
.UseOrleans(c =>
{
c.AddGrainService<DataService>() // Register GrainService
.ConfigureServices(services =>
{
// Register Client of GrainService
services.AddSingleton<IDataServiceClient, DataServiceClient>();
});
})
.NET