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

JPK*_*PKK 5 azure-service-fabric

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

Service1 必须先运行,然后 Service2 才能启动。

澄清:当我提到服务时,我不是指微服务,我指的是无状态服务,如 REST API (Service1) 和 WebSocket (Service2)。

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

Vac*_*cek 7

当然可以,因为您可以控制创建服务的时间。如果您只通过 Visual Studio 部署过应用程序,这并不是很明显,因为 Visual Studio 为您设置了Default Services。这是通过 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>
Run Code Online (Sandbox Code Playgroud)

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

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

它还隐藏了一些围绕应用程序和服务类型以及应用程序和服务实例的概念,这在您想要做更高级的事情之前仍然很方便,就像在您的情况下一样。

当你“部署”一个应用程序时,实际上有几个步骤:

  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
Run Code Online (Sandbox Code Playgroud)

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

所以你得到了一定程度的控制。但是,如果您的服务能够适应缺失的依赖服务,那确实是最好的,因为有时可能会因为某种原因而导致服务不可用。

编辑:我向您展示了很多 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