在服务结构应用程序中动态创建服务
Dynamically creating services in an service fabric application
这有点描述性,所以请耐心等待。 :)
在我尝试构建的应用程序中,产品具有不同的功能。用户可以选择加入功能 A、B、D 而不是 C。我构建它的方式是,每个不同的功能都是一个服务(无状态,我正在考虑将数据存储在 Azure SQL 数据库并从每个服务中公开 REST API)。将所有服务捆绑在一起是一个 ApplicationType。对于创建的每个客户租户(将其视为一组用户的共享帐户),我正在考虑使用 TenantManagementService 创建已注册 ApplicationType 的新具体实例,并在 [=12= 上调用 client.ApplicationManager.CreateApplicationAsync()
] 实例,以便我可以在我的节点上为该租户拥有一个专用的应用程序实例 运行。但是,正如我提到的,租户可以选择仅选择加入映射到服务子集的特定功能。如果租户只选择我的应用程序的服务 A,则与功能 B、C、D 对应的其余服务实例不应闲置在节点上 运行。
我考虑过为每个服务创建参与者,但我正在创建的服务是无状态的,我希望它们的多个实例在多个节点上主动 运行 以实现负载平衡而不是闲置有状态服务的副本。
类似于我对应用程序类型所做的事情,即在新租户注册时生成应用程序类型,我可以 spawn/delete 在租户想要 opt-in/out 产品功能时提供服务吗?
这是我尝试过的:
我尝试在打包我的应用程序时为服务设置 InstanceCount
0。在我的 ApplicationParameters
XML 文件中:
<Parameters>
<Parameter Name="FeatureAService_InstanceCount" Value="0" />
<Parameter Name="FeatureBService_InstanceCount" Value="0" />
</Parameters>
但是,Service Fabric Explorer 在实例化此类应用程序类型的应用程序时会崩溃。错误是这样的:
但另一方面,当一个服务部署在结构上时,它给了我一个选项来专门删除它,所以这个场景应该是有效的。
欢迎提出任何建议!
编辑:我的要求类似于安德索在这里提到的方法 - ,但是,我特别要解决的问题是上传创建一个应用程序实例,其中包含一个或多个打包实例数为零的服务!
不幸的是,您不能拥有 0 个实例服务,Service Fabric 认为命名服务始终存在 (运行)。在这种情况下,当您定义一个服务(为 serviceType 实例命名)时,它将至少有 1 个实例 运行,否则,如果它,您甚至不应该在您的应用程序中定义该服务不需要 运行.
但是您可以拥有的是 ServiceType 定义,这意味着您拥有二进制文件,但您将在需要时创建它。
我假设您受到默认服务的限制,在默认服务中您预先声明应用程序和服务结构(在部署任何应用程序实例之前),相反,您应该通过 FabricClient like you described, or via Powershell using New-ServiceFabricApplication and New-ServiceFabricService 使用动态服务创建。
这篇link你会指导你如何使用 FabricClient
@uplnCloud
希望我理解正确。
您的情况如下:
- 每个客户都应该有单独的应用程序(从同一个
ApplicationType
创建)。
- 每个客户应该只有服务的子集(在
ApplicationType
中定义)。
如果我做对了,那么这是开箱即用的支持。
首先,您应该从 ApplicationManifest.xml
中删除 <DefaultServices />
部分。这将指示 Service Fabric 不要使用应用程序自动创建服务。
现在算法如下:
- 使用
FabricClient.ApplicationManager.CreateApplicationAsync()
创建应用程序
- 使用
FabricClient.ServiceManager.CreateServiceAsync()
为每个必需的功能创建一个新的相应服务(您需要指定新创建的应用程序的应用程序名称)
另请注意 CreateServiceAsync()
接受 ServiceDescriptor 您可以配置所有与服务相关的参数 - 从分区模式开始到实例计数结束。
我只是将其添加为新答案,而不是对另一个答案发表评论。
如其他人所述,从您的 ApplicationManifest 中删除 DefaultServices。这样,您创建的 ApplicationType 的每个新实例都将在没有服务的情况下上线,并且您必须根据客户选择的功能手动创建这些实例。
此外,使用 "services per customer" 方法,确保您有足够的节点来处理在线客户时的负载。你最终会得到很多进程(因为应用程序实例)运行它们自己的服务进程,如果你的节点很少,其中有很多,重新启动到你的集群节点可能需要一点时间才能稳定下来,因为它可能会潜在地有许多服务需要搬迁。尽管 运行 无状态服务将减轻其中的很大一部分。
这有点描述性,所以请耐心等待。 :)
在我尝试构建的应用程序中,产品具有不同的功能。用户可以选择加入功能 A、B、D 而不是 C。我构建它的方式是,每个不同的功能都是一个服务(无状态,我正在考虑将数据存储在 Azure SQL 数据库并从每个服务中公开 REST API)。将所有服务捆绑在一起是一个 ApplicationType。对于创建的每个客户租户(将其视为一组用户的共享帐户),我正在考虑使用 TenantManagementService 创建已注册 ApplicationType 的新具体实例,并在 [=12= 上调用 client.ApplicationManager.CreateApplicationAsync()
] 实例,以便我可以在我的节点上为该租户拥有一个专用的应用程序实例 运行。但是,正如我提到的,租户可以选择仅选择加入映射到服务子集的特定功能。如果租户只选择我的应用程序的服务 A,则与功能 B、C、D 对应的其余服务实例不应闲置在节点上 运行。
我考虑过为每个服务创建参与者,但我正在创建的服务是无状态的,我希望它们的多个实例在多个节点上主动 运行 以实现负载平衡而不是闲置有状态服务的副本。
类似于我对应用程序类型所做的事情,即在新租户注册时生成应用程序类型,我可以 spawn/delete 在租户想要 opt-in/out 产品功能时提供服务吗?
这是我尝试过的:
我尝试在打包我的应用程序时为服务设置 InstanceCount
0。在我的 ApplicationParameters
XML 文件中:
<Parameters>
<Parameter Name="FeatureAService_InstanceCount" Value="0" />
<Parameter Name="FeatureBService_InstanceCount" Value="0" />
</Parameters>
但是,Service Fabric Explorer 在实例化此类应用程序类型的应用程序时会崩溃。错误是这样的:
但另一方面,当一个服务部署在结构上时,它给了我一个选项来专门删除它,所以这个场景应该是有效的。
欢迎提出任何建议!
编辑:我的要求类似于安德索在这里提到的方法 -
不幸的是,您不能拥有 0 个实例服务,Service Fabric 认为命名服务始终存在 (运行)。在这种情况下,当您定义一个服务(为 serviceType 实例命名)时,它将至少有 1 个实例 运行,否则,如果它,您甚至不应该在您的应用程序中定义该服务不需要 运行.
但是您可以拥有的是 ServiceType 定义,这意味着您拥有二进制文件,但您将在需要时创建它。
我假设您受到默认服务的限制,在默认服务中您预先声明应用程序和服务结构(在部署任何应用程序实例之前),相反,您应该通过 FabricClient like you described, or via Powershell using New-ServiceFabricApplication and New-ServiceFabricService 使用动态服务创建。
这篇link你会指导你如何使用 FabricClient
@uplnCloud
希望我理解正确。
您的情况如下:
- 每个客户都应该有单独的应用程序(从同一个
ApplicationType
创建)。 - 每个客户应该只有服务的子集(在
ApplicationType
中定义)。
如果我做对了,那么这是开箱即用的支持。
首先,您应该从 ApplicationManifest.xml
中删除 <DefaultServices />
部分。这将指示 Service Fabric 不要使用应用程序自动创建服务。
现在算法如下:
- 使用
FabricClient.ApplicationManager.CreateApplicationAsync()
创建应用程序
- 使用
FabricClient.ServiceManager.CreateServiceAsync()
为每个必需的功能创建一个新的相应服务(您需要指定新创建的应用程序的应用程序名称)
另请注意 CreateServiceAsync()
接受 ServiceDescriptor 您可以配置所有与服务相关的参数 - 从分区模式开始到实例计数结束。
我只是将其添加为新答案,而不是对另一个答案发表评论。
如其他人所述,从您的 ApplicationManifest 中删除 DefaultServices。这样,您创建的 ApplicationType 的每个新实例都将在没有服务的情况下上线,并且您必须根据客户选择的功能手动创建这些实例。
此外,使用 "services per customer" 方法,确保您有足够的节点来处理在线客户时的负载。你最终会得到很多进程(因为应用程序实例)运行它们自己的服务进程,如果你的节点很少,其中有很多,重新启动到你的集群节点可能需要一点时间才能稳定下来,因为它可能会潜在地有许多服务需要搬迁。尽管 运行 无状态服务将减轻其中的很大一部分。