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

时间:2016-03-17 12:42:59

标签: azure-service-fabric

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

在启动Service2之前,必须运行Service1。

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

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

2 个答案:

答案 0 :(得分:4)

当然可以,因为您可以控制何时创建服务。如果您只通过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将在您创建应用程序实例时创建它们。

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

它还隐藏了一些围绕应用程序和服务类型以及应用程序和服务实例的概念,这些概念在您想要执行更高级的操作之前也很方便,例如在你的情况下。

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

  1. 创建应用程序包
  2. 将包复制到群集
  3. 注册应用程序类型和版本
  4. 创建已注册的应用程序类型和版本的实例
  5. 在该应用程序中创建每个已注册服务类型的实例
  6. 使用默认服务,您跳过步骤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
    

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

    所以你得到一定程度的控制。但是,如果您的服务能够抵御缺少的相关服务,那么这种情况最好是因为服务因某种原因而无法使用。

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

答案 1 :(得分:0)

在服务架构领域,它被称为服务亲和力(https://azure.microsoft.com/en-us/documentation/articles/service-fabric-cluster-resource-manager-advanced-placement-rules-affinity/

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