다음을 통해 공유


곡물 서비스

곡물 기능을 지원하는 원격으로 액세스할 수 있는 분할된 서비스입니다. 곡물 서비스의 각 인스턴스는 일부 곡물 집합을 담당합니다. 이러한 곡물은 현재 서비스를 담당하는 곡물 서비스에 대한 참조를 얻을 수 있습니다 GrainServiceClient.

곡물 서비스는 Orleans 클러스터를 중심으로 곡물 처리에 대한 책임이 분산되어야 하는 경우를 지원하기 위해 존재합니다. 예를 들어 Orleans 미리 알림은 그레인 서비스를 사용하여 구현됩니다. 각 사일로는 그레인의 하위 집합에 대한 미리 알림 작업을 처리하고 미리 알림이 발동되면 해당 그레인을 알립니다.

사일로에서 곡물 서비스를 구성합니다. 사일로가 시작될 때 초기화되며, 이는 사일로 자체가 초기화를 완료하기 전입니다. 유휴 상태일 때 수집되지 않습니다. 대신, 그들의 수명은 사일로 자체의 수명 동안 연장됩니다.

곡물 서비스 만들기

A GrainService 는 특별한 특성을 가진 곡물로, 고정된 정체성이 없으며 모든 사일로에서 시작부터 종료까지 작동됩니다. IGrainService 인터페이스를 구현하는 것은 몇 가지 단계가 포함됩니다.

  1. 조직 서비스 통신 인터페이스를 정의합니다. 곡물 인터페이스를 구성할 때 사용하는 것과 동일한 원칙을 사용하여 GrainService의 인터페이스를 구축하십시오.

    public interface IDataService : IGrainService
    {
        Task MyMethod();
    }
    
  2. 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;
        }
    }
    
  3. 다른 곡물이 GrainServiceClient<TGrainService>에 연결하는 데 사용할 인터페이스를 GrainServiceClientGrainService에 만듭니다.

    public interface IDataServiceClient : IGrainServiceClient<IDataService>, IDataService
    {
    }
    
  4. 조직 서비스 클라이언트를 만듭니다. 클라이언트는 일반적으로 대상 서비스의 프록시 역할을 하므로 일반적으로 대상 서비스의 각 메서드에 대한 메서드를 추가합니다. 이러한 메서드는 대상 곡물 서비스에 대한 참조를 가져와서 호출할 수 있어야 합니다. 기본 클래스는 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();
    }
    
  5. 조직 서비스 클라이언트를 필요로 하는 다른 조직에 삽입합니다. 로컬 사일로에서 GrainServiceClient에 대한 GrainService의 액세스가 보장되지 않습니다. 클러스터의 모든 사일로에 있는 GrainService에 명령을 보낼 수 있습니다.

    public class MyNormalGrain: Grain<NormalGrainState>, INormalGrain
    {
        readonly IDataServiceClient _dataServiceClient;
    
        public MyNormalGrain(
            IGrainActivationContext grainActivationContext,
            IDataServiceClient dataServiceClient) =>
                _dataServiceClient = dataServiceClient;
    }
    
  6. 사일로에서 조직 서비스 및 조직 서비스 클라이언트를 구성합니다. 사일로가 작동하도록 이 작업을 수행해야 합니다 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>();
        });
    })