2

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

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

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

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

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

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

但是,在使用此类应用程序类型实例化应用程序时,Service Fabric Explorer 会出现问题。错误是这样的: 零服务实例计数错误

但另一方面,当服务部署在结构上时,它给了我一个选项来专门删除它,所以这个场景应该是有效的。 在此处输入图像描述

欢迎任何建议!

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

4

3 回答 3

5

@uplnCloud

我希望我理解一切正确。

你的情况如下:

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

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

首先,您应该<DefaultServices />ApplicationManifest.xml. 这将指示 Service Fabric 不使用应用程序自动创建服务。

现在算法如下:

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

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

于 2018-06-25T14:06:48.877 回答
1

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

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

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

于 2018-06-26T14:54:37.533 回答
1

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

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

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

链接将指导您如何使用 FabricClient 进行操作

于 2018-06-25T13:58:03.093 回答