在服务结构应用程序中动态创建服务

时间:2018-06-25 13:34:00

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

这有点描述性,请耐心等待。 :)

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

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

类似于我对应用程序类型所做的操作,即将应用程序类型作为新的租户注册生成,当租户希望选择加入/退出产品功能时,我可以生成/删除服务吗?

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

ApplicationParameters

但是,从这种应用程序类型实例化应用程序时,Service Fabric资源管理器会启动。错误是这样的: zero service instance count error

但是,另一方面,当在结构上部署服务时,它为我提供了一个删除它的选项,因此这种情况应该是有效的。 enter image description here

欢迎提出任何建议!

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

3 个答案:

答案 0 :(得分:2)

@uplnCloud

我希望我没事。

您的情况如下:

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

如果我做对了,那就可以立即使用。

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

现在,算法如下:

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

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

答案 1 :(得分:1)

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

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

我假设您受到默认服务的限制,在这些服务中,您先声明了应用程序和服务结构(在部署任何应用程序实例之前),相反,您应该像之前所述通过FabricClient使用动态服务创建,或通过Powershell使用New-ServiceFabricApplicationNew-ServiceFabricService来实现。

link指导您如何使用FabricClient进行操作

答案 2 :(得分:1)

我将其添加为新答案,而不是评论其他答案。

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

此外,采用“每个客户的服务”方法,请确保当您使客户在线时,您有足够的节点来处理负载。您将得到很多进程(因为应用程序实例运行着它们自己的服务进程),并且如果您的节点很少,且其中有很多进程,则重新启动群集节点可能需要一些时间才能稳定下来,因为它可以有目的地有很多服务需要迁移。充分运行无状态服务将大大缓解这一点。