Поделиться через


Реализация функций уровня сервиса в акторной службе

Как описано в слоении служб, сама актёрская служба является надежной службой. Вы можете написать собственную службу, наследуемую от ActorService. Вы также можете реализовать функции уровня сервиса таким же образом, как при наследовании сервиса с сохранением состояния, например:

  • Резервное копирование и восстановление службы.
  • Общая функциональность для всех участников, например, автоматический выключатель.
  • Удаленные вызовы процедур на службе акторов и на каждом отдельном актере.

Используйте службу акторов

Экземпляры акторов имеют доступ к сервису акторов, в котором они работают. Используя службу акторов, экземпляры акторов могут программно получить контекст службы. Контекст службы содержит идентификатор секции, имя службы, имя приложения и другие сведения о платформе Azure Service Fabric.

Task MyActorMethod()
{
    Guid partitionId = this.ActorService.Context.PartitionId;
    string serviceTypeName = this.ActorService.Context.ServiceTypeName;
    Uri serviceInstanceName = this.ActorService.Context.ServiceName;
    string applicationInstanceName = this.ActorService.Context.CodePackageActivationContext.ApplicationName;
}
CompletableFuture<?> MyActorMethod()
{
    UUID partitionId = this.getActorService().getServiceContext().getPartitionId();
    String serviceTypeName = this.getActorService().getServiceContext().getServiceTypeName();
    URI serviceInstanceName = this.getActorService().getServiceContext().getServiceName();
    String applicationInstanceName = this.getActorService().getServiceContext().getCodePackageActivationContext().getApplicationName();
}

Как и все службы Reliable Services, служба акторов должна быть зарегистрирована с типом службы в среде выполнения Service Fabric. Чтобы служба акторов выполняла экземпляры акторов, тип актора также должен быть зарегистрирован в службе акторов. Метод ActorRuntime регистрации выполняет эту работу для актеров. В самом простом случае можно зарегистрировать тип субъекта, а затем служба субъектов использует параметры по умолчанию.

static class Program
{
    private static void Main()
    {
        ActorRuntime.RegisterActorAsync<MyActor>().GetAwaiter().GetResult();

        Thread.Sleep(Timeout.Infinite);
    }
}

Кроме того, можно использовать лямбда-код, предоставляемый методом регистрации, чтобы создать службу субъектов самостоятельно. Затем можно настроить службу акторов и явно создать экземпляры акторов. Вы можете внедрить зависимости своему актеру через его конструктор.

static class Program
{
    private static void Main()
    {
        ActorRuntime.RegisterActorAsync<MyActor>(
            (context, actorType) => new ActorService(context, actorType, () => new MyActor()))
            .GetAwaiter().GetResult();

        Thread.Sleep(Timeout.Infinite);
    }
}
static class Program
{
    private static void Main()
    {
      ActorRuntime.registerActorAsync(
              MyActor.class,
              (context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
              timeout);

        Thread.sleep(Long.MAX_VALUE);
    }
}

Методы службы акторов

Служба акторов реализует IActorService (C#) или ActorService (Java), которые, в свою очередь, реализуют IService (C#) или Service (Java). Этот интерфейс используется для удаленного взаимодействия в службах Reliable Services, что позволяет удаленно вызывать процедуры в методах службы. Он содержит методы уровня обслуживания, которые можно вызывать удаленно с помощью удаленного взаимодействия службы. Его можно использовать для перечисления и удаления субъектов.

Настраиваемая служба акторов

Используя регистрацию акторов с использованием лямбда-функции, вы можете зарегистрировать собственную пользовательскую службу акторов, наследующуюся от ActorService (C#) и FabricActorService (Java). Затем можно реализовать собственные функциональные возможности уровня обслуживания, написав класс службы, наследующий ActorService (C#) или FabricActorService (Java). Пользовательская служба актеров наследует всю функциональность среды выполнения актера от ActorService (C#) или FabricActorService (Java). Его можно использовать для реализации собственных методов службы.

class MyActorService : ActorService
{
    public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, Func<ActorBase> newActor)
        : base(context, typeInfo, newActor)
    { }
}
class MyActorService extends FabricActorService
{
    public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, BiFunction<FabricActorService, ActorId, ActorBase> newActor)
    {
         super(context, typeInfo, newActor);
    }
}
static class Program
{
    private static void Main()
    {
        ActorRuntime.RegisterActorAsync<MyActor>(
            (context, actorType) => new MyActorService(context, actorType, () => new MyActor()))
            .GetAwaiter().GetResult();

        Thread.Sleep(Timeout.Infinite);
    }
}
public class Program
{
    public static void main(String[] args)
    {
        ActorRuntime.registerActorAsync(
                MyActor.class,
                (context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
                timeout);
        Thread.sleep(Long.MAX_VALUE);
    }
}

Реализация резервного копирования и восстановления акторов

Пользовательская служба актеров может предоставлять метод для резервного копирования данных актера, воспользовавшись прослушивателем удаленного взаимодействия, уже имеющимся в ActorService. См. пример в разделе Резервное копирование и восстановление актеров.

Субъект, использующий стек удаленного взаимодействия версии 2 (совместимый с интерфейсом)

Стек удаленного взаимодействия версии 2 (совместимый с интерфейсом, известный как V2_1) содержит все функции стека удаленного взаимодействия версии 2. Его интерфейс совместим с удалённой платформой версии 1, но не обладает обратной совместимостью с V2 и V1. Чтобы обновить версию 1 до V2_1 без влияния на доступность службы, выполните действия, описанные в следующем разделе.

Для использования стека удаленного доступа V2_1 требуются следующие изменения:

  1. Добавьте следующий атрибут сборки на интерфейсы акторов.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    
  2. Создайте и обновите проекты сервиса акторов и клиента акторов, чтобы начать использовать стек версии 2.

Обновление службы субъектов до стека удаленного взаимодействия версии 2 (совместимого с интерфейсом) без влияния на доступность службы

Это изменение является двухэтапным обновлением. Выполните действия, описанные в этой последовательности.

  1. Добавьте следующий атрибут сборки для интерфейсов акторов. Этот атрибут запускает два прослушивателя для актерной службы: V1 (существующего) и прослушивателя V2_1. Обновите службу акторов с помощью этого изменения.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    
  2. Обновите клиентов акторов после завершения предыдущего обновления. Этот шаг гарантирует, что прокси-актор использует стек удаленного вызова V2_1.

  3. Этот шаг является необязательным. Измените предыдущий атрибут, чтобы удалить прослушиватель версии 1.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    

Субъект, использующий стек удаленного взаимодействия версии 2

В пакете NuGet версии 2.8 пользователи теперь могут использовать стек удаленного взаимодействия версии 2, который обеспечивает более высокую производительность и предоставляет такие функции, как настраиваемая сериализация. Удаленное взаимодействие версии 2 не совместимо с существующим стеком удаленного взаимодействия (теперь называется стек удаленного взаимодействия версии 1).

Для использования стека удаленного взаимодействия версии 2 требуются следующие изменения.

  1. Добавьте следующий атрибут сборки в интерфейсы субъекта.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    
  2. Создайте и обновите проекты сервиса актёров и клиента актёров, чтобы начать использовать стек V2.

Обновление службы субъекта до стека удаленного взаимодействия версии 2 без влияния на доступность службы

Это изменение является двухэтапным обновлением. Выполните действия, описанные в этой последовательности.

  1. Добавьте следующий атрибут сборки в интерфейсы актёра. Этот атрибут запускает два прослушивателя для службы акторов: V1 (существующий) и прослушиватель V2. Обновите актёрский сервис с помощью этого изменения.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    
  2. Обновите клиенты акторов после завершения предыдущего обновления. Этот шаг гарантирует, что прокси-сервер субъекта использует стек удаленного взаимодействия версии 2.

  3. Этот шаг является необязательным. Измените предыдущий атрибут, чтобы удалить прослушиватель версии 1.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    

Дальнейшие действия