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

Как указано в описаниислоев службы, сама служба субъекта является надежной службой. Вы можете написать собственную службу, производную от службы 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, но не обладает обратной совместимостью с версиями 1 и (или) 2. Чтобы перейти с V1 на V2_1 без влияния на доступность службы, выполните действия, описанные в следующем разделе.

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

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

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

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

Это изменение является двухэтапным обновлением. Соблюдайте порядок действий в этой процедуре.

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

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

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

Это изменение является двухэтапным обновлением. Соблюдайте порядок действий в этой процедуре.

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

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

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

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

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