今天在一位客户我们分析了前几周的日志,我们发现了以下有关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秒)?
答案 0 :(得分:1)
就所涉及的限制而言,Topaz提供了一套内置的重试策略,包括: - 固定间隔 - 增量间隔 - 随机指数退避间隔
您也可以编写自定义重试策略并将其插入Topaz。
此外,正如布伦特所指出的,10秒等待不是强制性的。在许多情况下,立即重试可能会成功而无需等待。默认情况下,Topaz会在使用策略定义的重试间隔之前立即执行第一次重试。
有关详细信息,请参阅“构建弹性和弹性云应用程序”开发人员指南的Ch.6,也可从here以epub / mobi / pdf格式提供。
如果您有关于Topaz的建议/功能请求,请通过uservoice提交。
答案 1 :(得分:0)
我记得,“10秒”等待不是必需的。此外,TOPAZ我相信还具有退避功能,可以帮助你解决问题。
就个人而言,我认为仅仅使用像TOPAZ这样的东西并不足以创造一个真正有弹性的解决方案。弹性不仅限于单个连接点上的限制,您还需要能够处理故障转移到TOPAZ不会做的冗余端点。