【问题标题】:Dynamically creating services in an service fabric application在服务结构应用程序中动态创建服务
【发布时间】:2018-12-04 02:33:01
【问题描述】:

这有点描述性,所以请多多包涵。 :)

在我尝试构建的应用程序中,产品具有不同的功能。用户可以选择加入功能 A、B、D 但不是 C。我构建这个的方式是,每个不同的功能都是一个服务(无状态,我正在考虑将数据存储在 Azure SQL数据库并从每个服务公开 REST API)。将所有服务捆绑在一起是一个 ApplicationType。对于创建的每个客户租户(将其视为一组用户的共享帐户),我正在考虑使用 TenantManagementService 创建一个已注册 ApplicationType 的新具体实例,并在 FabricClient 实例上调用 client.ApplicationManager.CreateApplicationAsync() 以便我可以在我的节点上为该租户运行一个专用的应用程序实例。但是,正如我所提到的,租户可以选择仅选择映射到服务子集的特定功能。如果租户只选择了我的应用程序的服务 A,那么与特性 B、C、D 对应的其余服务实例不应在节点上空闲运行。

我想为每个服务创建参与者,但我正在创建的服务是无状态的,我希望它们的多个实例在多个节点上主动运行以实现负载平衡,而不是让有状态服务的空闲副本。

类似于我对应用程序类型所做的事情,即在新租户注册时生成应用程序类型,我可以在租户想要选择加入/退出产品功能时生成/删除服务吗?

这是我尝试过的: 在打包我的应用程序时,我尝试为服务设置InstanceCount 0。在我的ApplicationParameters XML 文件中:

<Parameters>
    <Parameter Name="FeatureAService_InstanceCount" Value="0" />
    <Parameter Name="FeatureBService_InstanceCount" Value="0" />
</Parameters>

但是,Service Fabric Explorer 在从此类应用程序类型中实例化应用程序时会出现问题。错误是这样的:

但另一方面,当服务部署在结构上时,我可以选择专门删除它,所以这种情况应该是有效的。

欢迎提出任何建议!

编辑:我的要求类似于 anderso 在此处提到的方法-https://stackoverflow.com/a/35248349/1842699,但是,我特别要解决的问题是上传创建一个应用程序实例,该实例具有一个或多个具有零实例的打包服务数一数!

【问题讨论】:

标签: azure azure-service-fabric service-fabric-stateless service-fabric-actor


【解决方案1】:

@uplnCloud

我希望我理解正确。

你的情况如下:

  • 每个客户都应该有单独的应用程序(从同一个ApplicationType 创建)。
  • 每个客户都应该只有服务的子集(在ApplicationType 中定义)。

如果我做对了,那么这是开箱即用的支持。

首先,您应该从ApplicationManifest.xml 中删除&lt;DefaultServices /&gt; 部分。这将指示 Service Fabric 不要使用应用程序自动创建服务。

现在算法如下:

  1. 使用FabricClient.ApplicationManager.CreateApplicationAsync() 创建应用程序
  2. 使用FabricClient.ServiceManager.CreateServiceAsync()为每个需要的功能创建一个新的对应服务(您需要指定新创建的应用程序的应用程序名称)

另请注意,CreateServiceAsync() 接受 ServiceDescriptor,您可以配置所有与服务相关的参数 - 从分区架构开始,到实例计数结束。

【讨论】:

  • 谢谢你们的帮助,我想这就是我需要的。此外,这种架构上的任何 cmets 都有每个租户的每个应用程序实例和每个应用程序实例下的一堆服务实例?你如何解决你的问题?
  • @upInCloud 我认为这是一个很好的解决方案。 Service Fabric 是专门以这种方式设计的,以允许这种缩放和组合。这里还有一个更重要的一点是每个应用程序实例都是单独升级的 - 所以如果您的客户不再需要更新那很好,您根本不会更新他的应用程序实例,而您总是可以继续升级其他人。
  • 感谢@Oleg Karasik,它有帮助!
【解决方案2】:

不幸的是,您不能拥有 0 个实例服务,Service Fabric 认为命名服务始终存在(运行)。在这种情况下,当您定义服务(为 serviceType 实例命名)时,它将至少运行 1 个实例,否则,如果不需要,您甚至不应该在应用程序上定义此服务正在运行。

但是您可以拥有 ServiceType 定义,这意味着您拥有二进制文件,但您将在需要时创建它。

我假设您受到默认服务的限制,您可以在其中预先声明应用程序和服务结构(在部署任何应用程序实例之前),相反,您应该像您描述的那样通过 FabricClient 或通过Powershell 使用 New-ServiceFabricApplicationNew-ServiceFabricService

这个link你指导你如何使用 FabricClient 来做这件事

【讨论】:

    【解决方案3】:

    我只是将其添加为新答案,而不是评论另一个答案。

    正如其他人所提到的,从您的 ApplicationManifest 中删除 DefaultServices。这样一来,您创建的 ApplicationType 的每个新实例都将在没有服务的情况下上线,您必须根据客户选择的功能手动创建这些实例。

    此外,采用“为每个客户提供服务”的方法,确保您有足够的节点来处理让客户在线时的负载。你最终会得到很多进程(因为应用程序实例)运行它们自己的服务进程,如果你的节点很少有很多这些,重启到你的集群节点可能需要一点时间来稳定,因为它可以潜在地有许多需要迁移的服务。尽管运行无状态服务将减轻这方面的很大一部分。

    【讨论】:

    • 我同意大量节点部分。在类似的情况下,这在架构上是否正确地为每个入职租户生成单独的进程集?我对微服务世界很陌生,因此这样做感觉有点奇怪和危险:)
    • 我不认为有什么问题,这只是取决于你想要完成什么。为每个客户提供服务或为所有在客户分离所需的部分中编码的所有服务提供一项服务并没有真正的区别。我们从每个客户的服务太多开始,然后将它们整合到系统范围的服务中,每个客户服务有一些处理对流程隔离等有意义的事情。在编码时间和硬件成本方面,您必须在要完成的任务和要花费的大量资源之间找到平衡
    • 知道了,我们的产品中目前有一堆不那么微的服务,每个服务都部署到一堆 Azure VM 上并相互通信。正如我们讨论的那样,我正在考虑将它们进一步拆分为更精细的服务并为每个客户部署它们。但是知道你有相反的旅程让我更多地思考这种方法!
    • 只要它们是无状态的,以后合并或拆分它们的成本应该是微不足道的,所以我会说做任何一种方法,然后评估它是如何进入的X 个月,看看您和您的操作人员是否满意。这就是我们所做的,并最终在中间的某个地方:)
    • 非常感谢@anderso,向有经验的人学习一些东西总是有帮助的!
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2019-03-22
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多