1

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

由于实体受到限制,请求已终止。请等待 10 秒,然后重试。

在验证了代码后,我告诉他们使用瞬态故障处理应用程序块 (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 秒)?

4

2 回答 2

1

就节流而言,Topaz提供了一组内置的重试策略,包括: - 固定间隔 - 增量间隔 - 随机指数回退间隔

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

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

有关更多信息,请参阅构建弹性和弹性云应用程序”开发人员指南的第 6 章,也可从此处获取 epub/mobi/pdf 格式。

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

于 2012-07-03T12:49:31.030 回答
0

我记得,“10 秒”等待不是必需的。此外,我相信 TOPAZ 还具有退避功能,可以帮助您克服困难。

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

于 2012-05-21T14:59:54.657 回答