在执行组件服务中实现服务级功能
如服务分层中所述,执行组件服务本身是一项可靠的服务。 可以编写自己的派生自 ActorService
的服务。 还可以实现服务级功能,所用方式与继承有状态服务的方式相同,例如:
- 服务备份和还原。
- 共享给所有执行组件的功能,例如断路器。
- 对执行组件服务自身和每个执行组件的远程过程调用。
使用执行组件服务
执行组件实例可访问运行这些实例的执行组件服务。 通过执行组件服务,执行组件实例可以编程方式获取服务上下文。 服务上下文包括分区 ID、服务名称、应用程序名称以及其他特定于 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);
}
}
或者,可以使用此注册方法提供的 lambda 自己构造执行组件服务。 然后可以配置执行组件服务和显式构造执行组件实例。 可以通过执行组件的构造函数向执行组件注入依赖项。
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 远程控制使用,该远程控制允许对服务方法执行远程过程调用。 它包含可以通过服务远程控制进行远程调用的服务级别方法。 可以使用它来枚举和删除执行组件。
自定义执行组件服务
通过使用执行组件注册 lambda,可以注册从 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
中已存在的远程侦听器公开备份执行组件数据的方法。 有关示例,请参阅备份和还原执行组件。
使用远程处理 V2(与接口兼容)堆栈的执行组件
远程处理 V2(与接口兼容,称为 V2_1)堆栈具有 V2 远程处理堆栈的所有功能。 其接口与远程处理 V1 堆栈兼容,但不与 V2 和 V1 后向兼容。 若要在不影响服务可用性的情况下从 V1 升级到 V2_1,请执行下一部分的步骤。
需要进行以下更改才能使用远程处理 V2_1 堆栈:
在执行组件接口中添加以下程序集属性。
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
生成并升级执行组件服务和执行组件客户端项目即可开始使用 V2 堆栈。
在不影响服务可用性的情况下将执行组件服务升级到远程处理 V2(与接口兼容)堆栈
此更改是一个两步升级过程。 请按顺序执行以下步骤。
在执行组件接口中添加以下程序集属性。 此属性针对执行组件服务启动两个侦听器:V1(现有)和 V2_1 侦听器。 通过此项更改升级执行组件服务。
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
在完成上一升级后升级执行组件客户端。 此步骤确保执行组件代理使用远程处理 V2_1 堆栈。
此步骤是可选的。 可以通过更改上述属性来删除 V1 侦听器。
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
使用远程处理 V2 堆栈的执行组件
借助 2.8 版 NuGet 包,用户现在可以使用性能更好且提供自定义序列化等功能的远程处理 V2 堆栈。 远程处理 V2 不后向兼容现有的远程处理堆栈(现在称为 V1 远程处理堆栈)。
需要进行以下更改才能使用远程处理 V2 堆栈。
在执行组件接口中添加以下程序集属性。
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
生成并升级执行组件服务和执行组件客户端项目即可开始使用 V2 堆栈。
在不影响服务可用性的情况下将执行组件服务升级到远程处理 V2 堆栈
此更改是一个两步升级过程。 请按顺序执行以下步骤。
在执行组件接口中添加以下程序集属性。 此属性针对执行组件服务启动两个侦听器:V1(现有)和 V2 侦听器。 通过此项更改升级执行组件服务。
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
在完成上一升级后升级执行组件客户端。 此步骤确保执行组件代理使用远程处理 V2 堆栈。
此步骤是可选的。 可以通过更改上述属性来删除 V1 侦听器。
[assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]