gpt4 book ai didi

c# - Polly Circuit Breaker 可以有指数 durationOfBreak 吗?

转载 作者:行者123 更新时间:2023-11-30 21:29:06 32 4
gpt4 key购买 nike

当我们收到由于耗尽连接池而导致的超时异常时,我们正在尝试为我们的数据库逻辑实现重试策略。当我们在短时间内出现异常大的事件峰值时,就会发生这种情况。我们增加了最大池大小以尽量避免这种情况,但我们也希望将重试逻辑作为备份计划。

documentation for connection pooling指出:

When connection pooling is enabled, and if a timeout error or other login error occurs, an exception will be thrown and subsequent connection attempts will fail for the next five seconds, the "blocking period". If the application attempts to connect within the blocking period, the first exception will be thrown again. Subsequent failures after a blocking period ends will result in a new blocking periods that is twice as long as the previous blocking period, up to a maximum of one minute.

Polly 似乎很适合通过回退、WaitAndRetry 和断路器策略的 PolicyWrap 组合来解决这个问题。这个有好图here

理想情况下,我希望能够为断路器指定指数 durationOfBreak 以匹配上述加倍周期。我没有在网上看到任何关于这如何可能的示例,所以也许这是不可能的?

此处所需的配置方法是什么?是指定一个5秒durationOfBreak的Circuit Breaker,然后对5秒、10秒、20秒、40秒、60秒的WaitAndRetry组件使用指数重试?在连接刚刚可用并且您的旧操作刚刚开始等待 40 秒而新操作将立即运行的情况下,这似乎很不幸。

另一种可能性是有一个 5 秒的 durationOfBreak,然后让 WaitAndRetry 组件使用非常短的等待时间并进行多次重试,尽管我们知道如果这些重试中的许多重试在文档说明之前发生,它们将会失败。

感谢您的反馈!

最佳答案

Polly 不提供具有不同(例如指数)断路持续时间的断路器。

以下内容乍一看似乎违反直觉,但是: 听起来好像这种情况不需要具有指数退避的断路器,因为 ADO.NET 连接池算法描述了已经有效地提供了。

推理:断路器的目的是停止将调用传递给不太可能处理它们的下游系统,以便:(a) 快速失败给调用者; (b) 保护底层系统免受过度负载。听起来好像 ADO.NET 的算法已经实现了这两个目标。

同样,指数退避重试策略的目标是防止重试本身“倍增”负载(在底层系统上创建一个 self 诱导的 DDOS 攻击......更多的请求进来,现有的请求也重试)。同样,这听起来像是 ADO.NET 的强制退避算法正在强制执行其自身的指数退避以保护底层数据库,因此可能 (*) 对您自己的 Polly 指数退避进行分层没有任何好处-最重要的是。

在 ADO.NET 提供自己防御的基础上,我很想做一些简单的事情,比如使用固定重试间隔为 5 秒或 5-plus-tiny-shim 秒的重试策略。 (无论“阻塞期”是什么,它似乎都是 5 秒的倍数。)

这个建议是基于这样一个假设:这个 ADO.NET 连接池管理(关于这个阻塞期)全部发生在调用方;也就是说,嵌入在调用应用程序中的 ADO.NET 代码决定其连接池已被充分利用,并在阻塞期间拒绝进一步的连接尝试,没有将网络调用传递给底层 SQL 服务器进行检查。如果该假设不正确,那么上面的建议 (*) 可能是错误的,您最好使用指数退避重试策略来避免连接重试尝试使数据库服务器过载。


警告:我没有直接使用这个特定的 ADO.NET 限制。那些有可能有更好的建议。那些更了解内部 ADO.NET 架构的人可能更了解每五秒尝试一次(正如我所建议的那样)有多么“昂贵”,这可能会被拒绝。


附录: 此讨论还忽略了调用者中导致线程/CPU 饥饿或类似情况的高并行需求的任何维度。如果这是一个问题,请考虑 pro-active load shedding在某个已知的可容忍限度内。

关于c# - Polly Circuit Breaker 可以有指数 durationOfBreak 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55735325/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com