同一节点上动态创建的服务的Service Fabric进程隔离



我有一个SF应用程序类型,由两种服务类型组成——无状态WebApi网关服务类型和无状态Worker服务类型。我正在创建一个具有默认网关服务实例的应用程序实例。Gateway服务实例通过使用以下代码(client变量是System.Fabric.FabricClient实例)根据需要动态创建Worker服务实例:

var serviceDescription = new StatefulServiceDescription()
{
ApplicationName = new Uri("fabric:/Gateway"),
ServiceName = new Uri("fabric:/Gateway/Worker-" + SomeUniqueWorkerId),
ServiceTypeName = "WorkerType",
HasPersistedState = true,
PartitionSchemeDescription = new UniformInt64RangePartitionSchemeDescription(),
MinReplicaSetSize = 1,
TargetReplicaSetSize = 1
};
await client.ServiceManager.CreateServiceAsync(serviceDescription);

当SF将Worker服务类型的两个或多个实例放置在一个节点上时,它们都共享同一进程(即Worker.exe)。这是有问题的,因为不同的Worker服务实例需要从不同的文件共享动态加载不同版本的程序集。因此,我的问题是:

是否可以强制SF在单独的进程中在一个节点上托管多个相同类型的服务实例?

(我认为来宾可执行程序是这样工作的。)

现在可以在创建服务时指定ServicePackageActivationMode

默认模式或ServicePackageActivationMode设置为"SharedProcess"时,所有这些服务对象都将在相同的进程中运行。但是,通过指定ExclusiveProcess,每个服务对象最终都将在自己的流程中创建。假设您在一个简单的5节点集群上部署了这两个无状态服务。

使用Shared|Default模式,您将获得5个进程,每个节点一个,每个进程中运行2个服务对象。使用Exclusive模式,您可以获得10个进程,每个节点2个,每个进程中运行一个服务对象

New-ServiceFabricService -Stateless -PartitionSchemeSingleton -ApplicationName "fabric:/App" -ServiceName "fabric:/App/svc" -ServiceTypeName "T1" -InstanceCount -1 -ServicePackageActivationMode ExclusiveProcess New-ServiceFabricService -Stateless -PartitionSchemeSingleton -ApplicationName "fabric:/App" -ServiceName "fabric:/App/svc" -ServiceTypeName "T2" -InstanceCount -1 -ServicePackageActivationMode ExclusiveProcess

在上面的例子中,您所需要做的就是添加

ServicePackageActivationMode = ServicePackageActivationMode.ExclusiveProcess添加到您的服务描述中。

这是一篇很好的文档,它详细介绍了每个模型以及如何选择适合特定情况的模型。最常见的情况是,我看到它用于避免共享静态信息,这些静态信息不能从服务代码中提取出来,而是在主机进程层拥有。

这是经过设计的,现在不可能在同一节点上的不同进程中运行同一类型的多个服务实例。然而,我们正在努力使这成为一种选择。

目前,如果您需要流程级隔离,则必须使用单独的应用程序实例。在您的场景中,您可以通过将Web服务和Worker服务分离为单独的应用程序类型来实现这一点。

相关内容

最新更新