Service Fabric - 每个服务实例的动态资源管理
Service Fabric - Dynamic resource government per service instance
TL;DR:有没有办法在我们创建的时候动态设置ServicePackageResourceGovernancePolicy
and/orResourceGovernancePolicy
的参数或者资源策略运行时某个 ServiceType 的新实例?
我们有一个用例,每个服务实例(不是类型)都有动态资源管理。
基本上,我们有一个服务类型:VotingDataType。
所以你在ApplicationManifest
中描述资源政府,taken from the docs这里有一个例子:
<ApplicationManifest>
...
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="VotingDataPkg" ServiceManifestVersion="1.0.0" />
...
<!-- Set resource governance at the service package level. -->
<ServicePackageResourceGovernancePolicy CpuCores="[CpuCores]" MemoryInMB="[Memory]"/>
<!-- Set resource governance at the code package level. -->
<ResourceGovernancePolicy CodePackageRef="Code" CpuPercent="10" MemoryInMB="[Memory]" BlockIOWeight="[BlockIOWeight]"
MaximumIOBandwidth="[MaximumIOBandwidth]" MaximumIOps="[MaximumIOps]" MemoryReservationInMB="[MemoryReservationInMB]"
MemorySwapInMB="[MemorySwapInMB]"/>
</Policies>
</ServiceManifestImport>
...
</ApplicationManifest
现在,我的自定义放置服务将为每位客户实例化一个新的 VotingDataType 实例。然而,在我们即将实例化一个新实例之前,通过我们获得的一些元数据,我们决定它是否需要一个更大的实例来开始。所以我们想要 20% CPU 的限制,而不是 10% CPU 的限制。
然后,我们的安置服务将使用以下方法创建该 VotingDataType 服务的新实例。 fabricClient.ServiceManager.CreateServiceAsync(...)
。但是,我们无法为 ResourceGovernancePolicy
自定义参数。
当我们在运行时创建某个ServiceType的新实例时,有没有办法动态设置ServicePackageResourceGovernancePolicy
and/or ResourceGovernancePolicy
的参数或资源策略?
应用程序参数是在应用程序级别定义的,因此这些值对指定应用程序内的所有服务都有效。
在您的情况下,如果每个租户都有一个命名的应用程序(实例),即使它们是相同的 AppType,也是合适的。这样您部署一次并创建具有不同配置或版本的多个服务。
每个租户一个应用程序也更好,因为您可以单独更新它们,因此每个租户都可以决定何时应用更新。
即:
ApplicationTypes
ApplicationType | Version
----------------------------
SalesAppType 1.0
SalesAppType 1.1
Applications (Named Applications)
Application | ApplicationType | Version
-------------------------------------------
Ten1-SalesApp SalesAppType 1.0
Ten2-SalesApp SalesAppType 1.0
Ten3-SalesApp SalesAppType 1.1
TL;DR:有没有办法在我们创建的时候动态设置ServicePackageResourceGovernancePolicy
and/orResourceGovernancePolicy
的参数或者资源策略运行时某个 ServiceType 的新实例?
我们有一个用例,每个服务实例(不是类型)都有动态资源管理。
基本上,我们有一个服务类型:VotingDataType。
所以你在ApplicationManifest
中描述资源政府,taken from the docs这里有一个例子:
<ApplicationManifest>
...
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="VotingDataPkg" ServiceManifestVersion="1.0.0" />
...
<!-- Set resource governance at the service package level. -->
<ServicePackageResourceGovernancePolicy CpuCores="[CpuCores]" MemoryInMB="[Memory]"/>
<!-- Set resource governance at the code package level. -->
<ResourceGovernancePolicy CodePackageRef="Code" CpuPercent="10" MemoryInMB="[Memory]" BlockIOWeight="[BlockIOWeight]"
MaximumIOBandwidth="[MaximumIOBandwidth]" MaximumIOps="[MaximumIOps]" MemoryReservationInMB="[MemoryReservationInMB]"
MemorySwapInMB="[MemorySwapInMB]"/>
</Policies>
</ServiceManifestImport>
...
</ApplicationManifest
现在,我的自定义放置服务将为每位客户实例化一个新的 VotingDataType 实例。然而,在我们即将实例化一个新实例之前,通过我们获得的一些元数据,我们决定它是否需要一个更大的实例来开始。所以我们想要 20% CPU 的限制,而不是 10% CPU 的限制。
然后,我们的安置服务将使用以下方法创建该 VotingDataType 服务的新实例。 fabricClient.ServiceManager.CreateServiceAsync(...)
。但是,我们无法为 ResourceGovernancePolicy
自定义参数。
当我们在运行时创建某个ServiceType的新实例时,有没有办法动态设置ServicePackageResourceGovernancePolicy
and/or ResourceGovernancePolicy
的参数或资源策略?
应用程序参数是在应用程序级别定义的,因此这些值对指定应用程序内的所有服务都有效。
在您的情况下,如果每个租户都有一个命名的应用程序(实例),即使它们是相同的 AppType,也是合适的。这样您部署一次并创建具有不同配置或版本的多个服务。
每个租户一个应用程序也更好,因为您可以单独更新它们,因此每个租户都可以决定何时应用更新。
即:
ApplicationTypes
ApplicationType | Version
----------------------------
SalesAppType 1.0
SalesAppType 1.1
Applications (Named Applications)
Application | ApplicationType | Version
-------------------------------------------
Ten1-SalesApp SalesAppType 1.0
Ten2-SalesApp SalesAppType 1.0
Ten3-SalesApp SalesAppType 1.1