Service Fabric进程隔离,用于在同一节点

时间:2017-01-25 19:25:47

标签: c# azure-service-fabric service-fabric-stateful

我有一个SF应用程序类型,包含两种服务类型 - 无状态WebApi网关服务类型和无状态工作服务类型。我正在使用默认网关服务实例创建一个应用程序实例。 Gateway服务实例通过使用这样的代码(client变量是System.Fabric.FabricClient实例)按需动态创建工作服务实例:

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)。这是有问题的,因为不同的工作服务实例需要从不同的文件共享动态加载不同版本的程序集。因此,我的问题是:

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

(我认为来宾可执行文件就是这样工作的。)

2 个答案:

答案 0 :(得分:2)

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

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

使用Shared | Default模式,您将获得5个进程,每个节点一个,每个进程内部运行2个服务对象。使用独占模式,您将获得10个进程,每个节点2个进程,每个进程内部运行1个服务对象。

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到您的ServiceDescription。

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

答案 1 :(得分:1)

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

目前,如果您需要进程级别隔离,则必须使用单独的应用程序实例。在您的方案中,您可以通过将Web服务和Worker服务分离为单独的应用程序类型来完成此操作。