如何配置无状态服务的启动顺序?

How to configure startup order of stateless services?

是否可以在启动服务时配置启动顺序。

Service1 必须 运行 才能启动 Service2。

说明: 当我提到服务时,我并不是指微服务,我指的是像 REST API (Service1) 和 WebSocket (Service2) 这样的无状态服务。

那么当部署解决方案时,WebSocket 服务 (Service2) 必须启动并且 运行 在 REST API (Service1) 之前?

在服务结构世界中,它称为服务亲和性 (https://azure.microsoft.com/en-us/documentation/articles/service-fabric-cluster-resource-manager-advanced-placement-rules-affinity/)

无论如何,在微服务世界中尽量避免这些情况。 祝你好运。

当然可以,因为您可以控制何时创建服务。如果您只通过 Visual Studio 部署过应用程序,则不会立即显而易见,因为 Visual Studio 为您设置了 默认服务 。这是您通过 Visual Studio:

创建应用程序时在 ApplicationManifest.xml 中看到的内容
<DefaultServices>
   <Service Name="Stateless1">
      <StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
         <SingletonPartition />
      </StatelessService>
   </Service>
   <Service Name="Stateful1">
      <StatefulService ServiceTypeName="Stateful1Type" TargetReplicaSetSize="[Stateful1_TargetReplicaSetSize]" MinReplicaSetSize="[Stateful1_MinReplicaSetSize]">
         <UniformInt64Partition PartitionCount="[Stateful1_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
      </StatefulService>
   </Service>
</DefaultServices>

当您知道每次创建应用程序实例时总是希望以特定方式创建特定服务时,这是一个很好的便利。您可以在此处以声明方式定义它们,Service Fabric 将在您创建应用程序实例时创建它们。

但它有一些缺点。最值得注意的是,在您的情况下,您无法控制创建服务的顺序。

它还隐藏了一些关于应用程序和服务 types 以及应用程序和服务 instances 的概念,这在您之前也很方便想做一些更高级的事情,就像你的情况一样。

当你"deploy"申请时,实际上有几个步骤:

  1. 创建应用程序包
  2. 将包复制到集群
  3. 注册应用程序类型和版本
  4. 创建已注册应用程序类型和版本的实例
  5. 在该应用程序中创建每个注册服务类型的实例

对于默认服务,您可以跳过第 5 步,因为 Service Fabric 会为您完成。如果没有默认服务,您可以自己创建服务实例,因此您可以确定执行顺序。您可以做其他事情,例如在创建下一个服务之前检查服务是否准备就绪。所有这些操作都可在 Service Fabric 的 C# SDK 和 PowerShell cmdlet 中使用。这是一个快速的 PowerShell 示例:

Copy-ServiceFabricApplicationPackage -ApplicationPackagePath C:\temp\MyApp -ImageStoreConnectionString fabric:ImageStore -ApplicationPackagePathInImageStore MyApp

Register-ServiceFabricApplicationType MyApp

New-ServiceFabricApplication -ApplicationName fabric:/MyAppInstance -ApplicationTypeName MyApp -ApplicationTypeVersion 1.0

New-ServiceFabricService -ApplicationName fabric:/MyAppInstance -InstanceCount 1 -PartitionSchemeSingleton -ServiceName fabric:/MyAppInstance/MyStatelessService -ServiceTypeName MyStatelessService -Stateless

New-ServiceFabricService -ApplicationName fabric:/MyAppInstance -MinReplicaSetSize 2 -PartitionSchemeSingleton -ServiceName fabric:/MyAppInstance/MyStatefulService -ServiceTypeName MyStatefulServiceType -Stateful -TargetReplicaSetSize 3

当然,这仅适用于创建服务实例。当需要升级您的服务时,"upgrade unit" 实际上是应用程序,因此您无法选择应用程序中服务的升级顺序,至少不能在一次升级中选择。但是,您可以选择在应用程序升级期间升级哪些 服务,因此如果您具有相同的顺序依赖性,则可以通过执行两个单独的应用程序升级来完成。

因此您可以获得一定程度的控制。但是,如果您的服务能够适应缺失的依赖服务,那真的是最好的,因为有时服务可能会因为某种原因不可用。

编辑: 我向您展示了很多 PowerShell,但我应该提到 C# API 也同样强大。您可以使用 C# 中的全套管理工具。例如,您可以拥有创建和管理其他服务的服务。在您的情况下,如果服务 A 依赖于服务 B,那么您可以让服务 A 在服务 A 本身执行任何工作之前创建服务 B 的实例,并且在服务 A 的整个生命周期中它都可以关注服务 B。这是一个示例创建其他应用程序和服务的服务:https://github.com/Azure-Samples/service-fabric-dotnet-management-party-cluster/blob/master/src/PartyCluster.ApplicationDeployService/FabricClientApplicationOperator.cs