Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure 在服务结构应用程序中动态创建服务_Azure_Azure Service Fabric_Service Fabric Stateless_Service Fabric Actor - Fatal编程技术网

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

Azure 在服务结构应用程序中动态创建服务,azure,azure-service-fabric,service-fabric-stateless,service-fabric-actor,Azure,Azure Service Fabric,Service Fabric Stateless,Service Fabric Actor,这有点描述性,请耐心听我说。:) 在我试图构建的应用程序中,产品具有不同的功能。用户可以选择加入功能A、B、D,但不能选择C。我构建这一功能的方式是,每个不同的功能都是一个服务(无状态,我考虑将数据存储在Azure SQL DBs中,并从每个服务中公开REST API)。将所有服务捆绑在一起是一个ApplicationType。对于创建的每个客户租户(将其视为一组用户的共享帐户),我考虑使用租户管理服务创建已注册ApplicationType的新具体实例,并调用client.Applicatio

这有点描述性,请耐心听我说。:)

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

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

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

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

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

但是,当从此类应用程序类型中实例化应用程序时,Service Fabric Explorer将被禁用。错误是:

但另一方面,当一个服务部署在结构上时,它给了我一个删除它的选项,所以这个场景应该是有效的。

欢迎提出任何建议


编辑:我的要求类似于anderso在这里提到的方法-,但是,我特别试图解决的问题是上传创建一个应用程序实例,其中一个或多个打包服务的实例数为零

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

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

我假设您受到默认服务的限制,在默认服务中,您预先声明应用程序和服务结构(在部署任何应用程序实例之前),相反,您应该使用动态服务创建,如您所述,或者使用和通过Powershell

这将指导您如何使用FabricClient执行此操作

我希望我理解的一切都是正确的

你的情况如下:

  • 每个客户都应该有单独的应用程序(从相同的
    ApplicationType
    创建)
  • 每个客户应该只有服务的子集(在
    ApplicationType
    中定义)
如果我做对了,这是开箱即用的支持

首先,您应该从
ApplicationManifest.xml
中删除
部分。这将指示服务结构不使用应用程序自动创建服务

现在,算法如下所示:

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

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

    我只将此作为一个新答案添加,而不是对另一个答案进行注释

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


    此外,使用“每个客户的服务”方法,确保在让客户联机时有足够的节点来处理负载。最终会有很多进程(因为应用程序实例)运行它们自己的服务进程,如果只有少数节点有很多这样的进程,那么重新引导到集群节点可能需要一些时间才能稳定下来,因为它可能需要重新定位许多服务。尽管运行无状态服务将在很大程度上缓解这一问题。

    谢谢你们的帮助,我想这正是我需要的。另外,对于这种体系结构,即每个租户有一个应用程序实例,每个应用程序实例下有一堆服务实例,有什么评论吗?你如何着手解决你的问题?@upInCloud我认为这是一个很好的解决办法。服务结构是以这种方式专门设计的,以允许这种扩展和组合。这里还有一个更重要的一点是,每个应用程序实例都是单独升级的-因此,如果您的客户不再需要更新,那么您就不需要更新他的应用程序实例,而您始终可以继续升级其他应用程序实例。谢谢@