1

我有一个由两种服务类型组成的 SF 应用程序类型——无状态 WebApi 网关服务类型和无状态 Worker 服务类型。我正在使用默认网关服务实例创建一个应用程序实例。Gateway 服务实例使用如下代码按需动态创建 Worker 服务实例(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)。这是有问题的,因为不同的 Worker 服务实例需要从不同的文件共享中动态加载不同版本的程序集。因此,我的问题是:

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

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

4

2 回答 2

4

您现在可以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到您的服务描述。

是一篇很好的文档,其中详细介绍了每个模型以及如何选择适合给定情况的模型。最常见的是,我看到它用于避免共享无法从服务代码中分解并在主机进程层拥有的静态。

于 2018-03-12T21:28:43.523 回答
1

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

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

于 2017-01-25T19:37:19.723 回答