Windows Azure服务总线队列:限制和TOPAZ

时间:2012-05-21 14:53:38

标签: azure enterprise-library

今天在一位客户我们分析了前几周的日志,我们发现了以下有关Windows Azure服务总线队列的问题:

  

请求已终止,因为实体正受到限制。   请等待10秒钟再试一次。

验证代码后,我告诉他们使用Transient Fault Handing Application Block(TOPAZ)来实现像这样的重试策略:

 var retryStrategy = new Incremental(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
 var retryPolicy = new RetryPolicy<ServiceBusTransientErrorDetectionStrategy>(retryStrategy);

客户回答:

  

“啊那很好,所以它也会处理它应该等待的事实   受到限制时持续10秒。“

来考虑一下,我从未验证过是否是这种情况。我一直认为这是事实。在 Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling 程序集中,我查找了在节流但未找到任何内容的情况下等待10秒的代码。

这是否意味着TOPAZ不足以创建弹性应用程序?是否应该与一些自定义代码结合起来处理限制(即:在特定异常的情况下等待10秒)?

2 个答案:

答案 0 :(得分:1)

就所涉及的限制而言,Topaz提供了一套内置的重试策略,包括:   - 固定间隔   - 增量间隔   - 随机指数退避间隔

您也可以编写自定义重试策略并将其插入Topaz。

此外,正如布伦特所指出的,10秒等待不是强制性的。在许多情况下,立即重试可能会成功而无需等待。默认情况下,Topaz会在使用策略定义的重试间隔之前立即执行第一次重试。

有关详细信息,请参阅“构建弹性和弹性云应用程序”开发人员指南的Ch.6,也可从here以epub / mobi / pdf格式提供。

如果您有关于Topaz的建议/功能请求,请通过uservoice提交。

答案 1 :(得分:0)

我记得,“10秒”等待不是必需的。此外,TOPAZ我相信还具有退避功能,可以帮助你解决问题。

就个人而言,我认为仅仅使用像TOPAZ这样的东西并不足以创造一个真正有弹性的解决方案。弹性不仅限于单个连接点上的限制,您还需要能够处理故障转移到TOPAZ不会做的冗余端点。