【发布时间】:2019-09-08 03:49:25
【问题描述】:
当由于连接池耗尽而收到超时异常时,我们正在尝试为我们的数据库逻辑实施重试策略。当我们在短时间内出现异常大的活动高峰时,就会发生这种情况。我们增加了最大池大小来尝试避免这种情况,但我们也希望将重试逻辑作为备用计划。
documentation for connection pooling 声明:
启用连接池后,如果发生超时错误或其他登录错误,将引发异常,随后的连接尝试将在接下来的五秒内失败,即“阻塞期”。如果应用程序在阻塞期内尝试连接,将再次抛出第一个异常。阻塞期结束后的后续故障将导致新的阻塞期是前一个阻塞期的两倍,最长为一分钟。
Polly 似乎非常适合解决这个问题,它通过策略包组合 Fallback、WaitAndRetry 和断路器策略。这张图不错here
理想情况下,我希望能够为断路器指定指数 durationOfBreak 以匹配上述加倍周期。我还没有在网上看到任何关于这怎么可能的例子,所以也许这是不可能的?
这里期望的配置方法是什么?是否指定一个具有 5 秒 durationOfBreak 的断路器,然后对 5、10、20、40 和 60 秒的 WaitAndRetry 组件使用指数重试?如果连接刚刚可用并且您的旧操作刚刚开始等待 40 秒,而新操作将立即运行,这似乎很不幸。
另一种可能性是设置一个 5 秒的 durationOfBreak,然后让 WaitAndRetry 组件使用一个非常小的等待并进行多次重试,尽管我们知道如果这些重试在文档状态之前出现,其中许多重试将失败。
感谢您的反馈!
【问题讨论】:
标签: c# ado.net circuit-breaker polly exponential-backoff