Реализация функций уровня службы в службе субъектов
Как указано в описаниислоев службы, сама служба субъекта является надежной службой. Вы можете написать собственную службу, производную от службы 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, требуется внести следующие изменения.
Добавьте приведенный ниже атрибут сборки в интерфейсы субъекта.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Выполните сборку и обновление проектов службы и клиента субъекта, чтобы начать использование стека версии 2.
Обновление службы субъекта для использования стека удаленного взаимодействия версии 2 (с совместимым интерфейсом) без влияния на доступность службы
Это изменение является двухэтапным обновлением. Соблюдайте порядок действий в этой процедуре.
Добавьте приведенный ниже атрибут сборки в интерфейсы субъекта. Этот атрибут запустит два прослушивателя для службы субъекта: прослушиватель версии 1 (имеющийся) и прослушиватель версии 2_1. Обновите службу субъекта, внеся в нее это изменение.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Обновите клиенты субъекта после завершения предыдущего обновления. Это гарантирует, что прокси-сервер субъекта будет использовать стек удаленного взаимодействия версии 2_1.
Этот шаг необязательный. Измените приведенный выше атрибут, чтобы удалить прослушиватель версии 1.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
Субъект, использующий стек удаленного взаимодействия версии 2
Теперь с помощью пакета NuGet 2.8 пользователи могут использовать стек удаленного взаимодействия версии 2, который лучше работает и предоставляет такие функции, как настраиваемая сериализация. Стек удаленного взаимодействия версии 2 не обеспечивает обратную совместимость с имеющимся стеком удаленного взаимодействия (который теперь называется стеком удаленного взаимодействия версии 1).
Для использования стека удаленного взаимодействия версии 2 требуется внести следующие изменения.
Добавьте приведенный ниже атрибут сборки в интерфейсы субъекта.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
Выполните сборку и обновление проектов службы и клиента субъекта, чтобы начать использование стека версии 2.
Обновление службы субъекта для использования стека удаленного взаимодействия версии 2 без влияния на доступность службы
Это изменение является двухэтапным обновлением. Соблюдайте порядок действий в этой процедуре.
Добавьте приведенный ниже атрибут сборки в интерфейсы субъекта. Этот атрибут запустит два прослушивателя для службы субъекта: прослушиватель версии 1 (имеющийся) и прослушиватель версии 2. Обновите службу субъекта, внеся в нее это изменение.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
Обновите клиенты субъекта после завершения предыдущего обновления. Это гарантирует, что прокси-сервер субъекта будет использовать стек удаленного взаимодействия версии 2.
Этот шаг необязательный. Измените приведенный выше атрибут, чтобы удалить прослушиватель версии 1.
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]