【问题标题】:Service Fabric process isolation for dynamically created services on the same node同一节点上动态创建的服务的 Service Fabric 进程隔离
【发布时间】:2017-06-11 03:05:06
【问题描述】:

我有一个 SF 应用程序类型,它包含两种服务类型——无状态 WebApi Gateway 服务类型和无状态 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在不同进程中的一个节点上托管多个相同类型的服务实例?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    使用共享|默认模式,您将获得 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 是一篇很好的文档,其中详细介绍了每个模型以及如何选择适合特定情况的模型。最常见的情况是,我看到它用于避免共享无法从服务代码中分解并在主机进程层拥有的静态。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 或者创建更多相同应用类型的应用实例,并创建该应用类型的新实例,只包含 Worker 服务类型的实例。我同意单独的应用类型在这里可能更清楚,但两个选项都可用。
      • @vaclav-turecek 您能否指出一些描述它如何将服务实例映射到同一进程的 Service Fabric 文档?我不记得在文档中看到任何描述此行为的内容。不幸的是,在同一个进程中破坏了我们围绕 DI(使用 StructureMap)的一些管道,因为我们甚至在同一个节点上也期望进程级别隔离。
      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 2021-11-03
      • 2018-10-03
      • 2017-05-29
      • 1970-01-01
      • 2017-03-29
      • 2019-05-25
      • 1970-01-01
      相关资源
      最近更新 更多