基于队列长度的 Azure 自动缩放
Posted
技术标签:
【中文标题】基于队列长度的 Azure 自动缩放【英文标题】:Azure autoscaling based on length of queue 【发布时间】:2012-11-16 23:33:48 【问题描述】:我想根据 azure 队列的长度自动调整我的 azure worker 角色。根据所有documentation,我看到这应该非常简单,使用 queueLength 操作数。
我已经实现了自动缩放器,将其上传到我的服务并在我的队列中添加了一堆元素,但实例的数量并没有增加。
排除故障的最佳方法是什么?我已远程桌面化到该角色,事件日志中没有任何内容。是否有我可以检查的自动缩放事件/错误日志?
编辑: 当我在开发环境中运行应用程序时,我看到 autscaler 已成功加载 ServiceInfo.xml。有一个队列条目和一个角色条目。但是,规则似乎没有从 rules.xml 文件中加载出来。
更多编辑: 当我从 rules.xml 文件中删除反应规则和操作数节点时,约束规则加载成功。所以问题出在其中一个节点上。
我的 serviceinfo xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<serviceModel xmlns="http://schemas.microsoft.com/practices/2011/entlib/autoscaling/serviceModel">
<subscriptions>
<subscription name="MySubscription" subscriptionId="blah" certificateThumbprint="blah" certificateStoreName="My" certificateStoreLocation="CurrentUser">
<storageAccounts>
<storageAccount alias="targetstorage" connectionString="DefaultEndpointsProtocol=https;AccountName=blah; AccountKey="blah">
<queues>
<queue alias="auditqueue" queueName="auditqueue"/>
</queues>
</storageAccount>
</storageAccounts>
<services>
<service dnsPrefix="blah" slot="Production" scalingMode="Scale">
<roles>
<role alias="ScalingWebRole" roleName="ScalingWebRole" wadStorageAccountName="targetstorage" />
</roles>
</service>
</services>
</subscription>
</subscriptions>
</serviceModel>
我的规则 xml 文件:
<constraintRules>
<rule name="Default" enabled="true" rank="1">
<actions>
<range target="ScalingWebRole" min="1" max="10" />
</actions>
</rule>
</constraintRules>
<reactiveRules>
<rule name="Scale up when queue is long" enabled="true">
<actions>
<scale target="ScalingWebRole" by="1" />
</actions>
<when>
<greaterOrEqual operand="QueueLength_Avg" than="5" />
</when>
</rule>
<rule name="Scale down when queue is short" enabled="true">
<actions>
<scale target="ScalingWebRole" by="-1" />
</actions>
<when>
<less operand="QueueLength_Avg" than="5" />
</when>
</rule>
</reactiveRules>
<operands>
<queueLength alias="QueueLength_Avg" aggregate="Average" queue="auditqueue" timespan="00:01:00" />
</operands>
</rules>
【问题讨论】:
【参考方案1】:在诊断提供的帮助下(感谢@Julian Dominguez),很明显,自动缩放块第一次尝试访问服务(检查队列长度)时失败了。这是因为系统在 CurrentUser 存储而不是 LocalMachine 存储中查找证书。
一旦我在配置中更改了该设置,它就开始工作了。
【讨论】:
【参考方案2】:Wasabi 会发布大量诊断信息,但您必须启用它。在您托管自动缩放器的角色中,更新 app.config 以包含以下内容:
<system.diagnostics>
<sources>
<source name="Autoscaling General" switchValue="All">
<listeners>
<add name="AzureDiag" />
</listeners>
</source>
<source name="Autoscaling Updates" switchValue="All">
<listeners>
<add name="AzureDiag" />
</listeners>
</source>
</sources>
<sharedListeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiag"/>
</sharedListeners>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiagnostics">
<filter type="" />
</add>
</listeners>
</trace>
</system.diagnostics>
然后,如果您的角色配置为将日志条目上传到 WADs 表(Windows Azure 诊断表),您将在那里看到这些条目。
有关 Wasabi 生成的日志条目的更多信息 here。
【讨论】:
感谢您的建议。我已将其添加到我的配置中,但它仍然没有编写诊断程序(据我所知)。还有其他想法吗?以上是关于基于队列长度的 Azure 自动缩放的主要内容,如果未能解决你的问题,请参考以下文章
您可以在基于 Cloud Pub/Sub 队列的 Google App Engine 中触发自动缩放吗?
我们可以自动和动态地剥离一个 Kubernetes cronjob 吗?我们如何在基于队列或通知的 AWS EKS、Azure AKS 中做到这一点?