Grain Services

Grain Services, işlevsellik dilimlerini desteklemek için uzaktan erişilebilir, bölümlenmiş hizmetlerdir. Bir tahıl hizmetinin her örneği bazı tahıl kümelerinden sorumludur ve bu tanecikler, şu anda bir GrainServiceClientkullanarak hizmet vermekle sorumlu olan tahıl hizmetine başvuru alabilir.

Tahıl Hizmetleri, bakım taneciklerinin sorumluluğunun kümenin etrafına Orleans dağıtılması gereken durumları desteklemek için vardır. Örneğin, Orleans Anımsatıcılar tahıl hizmetleri kullanılarak uygulanır: her silo, bir dilim alt kümesi için anımsatıcı işlemlerini işlemek ve anımsatıcıları tetiklendiğinde bu taneleri bilgilendirmekle sorumludur.

Tahıl Hizmetleri silolarda yapılandırılır ve silo başlatıldığında, silo başlatma tamamlanmadan önce başlatılır. Boşta olduklarında toplanmazlar ve bunun yerine silonun ömrü boyunca uzanan yaşam süreleri vardır.

GrainService oluşturma

A GrainService , kararlı kimliği olmayan ve başlangıçtan kapatmaya kadar her siloda çalışan özel bir tahıldır. Bir arabirimi uygularken IGrainService birkaç adım vardır.

  1. Tahıl hizmeti iletişim arabirimini tanımlayın. arabirimi, bir GrainService tanenin arabirimini oluşturmak için kullanacağınız ilkeler kullanılarak oluşturulur.

    public interface IDataService : IGrainService
    {
        Task MyMethod();
    }
    
  2. DataService Tahıl hizmetini oluşturun. Ayrıca, içinden tahıl çağrıları GrainServiceyapabilmeniz için bir IGrainFactory de ekleyebileceğinizi bilmek güzeldir.

    [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. 'a bağlanmak GrainServiceüzere GrainServiceClient<TGrainService>GrainServiceClient diğer tanecikler tarafından kullanılacak bir arabirim oluşturun.

    public interface IDataServiceClient : IGrainServiceClient<IDataService>, IDataService
    {
    }
    
  1. Grain service istemcisini oluşturun. İstemciler genellikle hedefledikleri hub'lı hizmetler için ara sunucu görevi görür, bu nedenle genellikle hedef hizmette her yöntem için bir yöntem eklersiniz. Bu yöntemlerin, araya çağırabilmeleri için hedefledikleri tahıl hizmetine bir başvuru alması gerekir. GrainServiceClient<T> Temel sınıf, yöntemin GetGrainService birkaç aşırı yüklemesini sağlar. Bu, bir , sayısal karmaya (uint) veya öğesine GrainIdSiloAddresskarşılık gelen bir taneli başvuru döndürebilir. İkinci iki aşırı yükleme, bir geliştiricinin sorumluluğu konaklarla eşlemek için farklı bir mekanizma kullanmak istediği veya bir konağı doğrudan ele almak istediği gelişmiş durumlara yöneliktir. Aşağıdaki örnek kodumuzda, GrainServiceöğesini çağıran DataServiceClienttanecik için değerini döndüren IDataService bir özelliği tanımlarız. Bunu yapmak için, özelliğiyle CurrentGrainReference birlikte aşırı yüklemeyi kullanırızGetGrainService(GrainId).

    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();
    }
    
  1. Gerçek tahıl hizmeti istemcisini oluşturun. Yalnızca veri hizmeti için ara sunucu işlevi görür. Ne yazık ki, yalnızca basit tek satırlı olan tüm yöntem eşlemelerini el ile yazmanız gerekir.

    public class DataServiceClient : GrainServiceClient<IDataService>, IDataServiceClient
    {
        public DataServiceClient(IServiceProvider serviceProvider)
            : base(serviceProvider)
        {
        }
    
        public Task MyMethod() => GrainService.MyMethod();
    }
    
  1. Tahıl hizmeti istemcisini ihtiyacı olan diğer tahıllara enjekte edin. GrainServiceClient yerel siloya erişmesi GrainService garanti değildir. Komutunuz kümedeki herhangi bir siloda adresine gönderilebilir GrainService .

    public class MyNormalGrain: Grain<NormalGrainState>, INormalGrain
    {
        readonly IDataServiceClient _dataServiceClient;
    
        public MyNormalGrain(
            IGrainActivationContext grainActivationContext,
            IDataServiceClient dataServiceClient) =>
                _dataServiceClient = dataServiceClient;
    }
    
  2. Siloda grain service ve grain service istemcisini yapılandırın. Silonun öğesini başlatması GrainServiceiçin bunu yapmanız gerekir.

    (ISiloHostBuilder builder) =>
        builder.ConfigureServices(
            services => services.AddGrainService<DataService>()
                                .AddSingleton<IDataServiceClient, DataServiceClient>());
    

Ek notlar

Tahıl hizmetlerini kaydetmek için kullanılan bir uzantı yöntemi GrainServicesSiloBuilderExtensions.AddGrainService vardır.

services.AddSingleton<IGrainService>(
    serviceProvider => GrainServiceFactory(grainServiceType, serviceProvider));

Silo, başlatılırken hizmet sağlayıcısından türleri getirir IGrainService : orleans/src/Orleans. Çalışma Zamanı/Silo/Silo.cs

var grainServices = this.Services.GetServices<IGrainService>();

Microsoft..Orleans. Proje, Çalışma Zamanı NuGet paketine GrainService başvurmalıdır.

Microsoft..Orleans.OrleansProje, Çalışma Zamanı NuGet paketine GrainService başvurmalıdır.

Bunun çalışması için hem hizmeti hem de istemcisini kaydetmeniz gerekir. Kod şuna benzer:

var builder = new HostBuilder()
    .UseOrleans(c =>
    {
        c.AddGrainService<DataService>()  // Register GrainService
        .ConfigureServices(services =>
        {
            // Register Client of GrainService
            services.AddSingleton<IDataServiceClient, DataServiceClient>();
        });
    })