- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我们收到由于耗尽连接池而导致的超时异常时,我们正在尝试为我们的数据库逻辑实现重试策略。当我们在短时间内出现异常大的事件峰值时,就会发生这种情况。我们增加了最大池大小以尽量避免这种情况,但我们也希望将重试逻辑作为备份计划。
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/
我正在尝试为我的 Rest 客户创建一个综合弹性策略,为此我编写了以下内容: private static Policy circuitBreakerPolicy = Policy .Han
我以前从未使用过 Polly,不确定这是否适合 Polly。 我正在调用 POST 正文中包含 1000 个 DTO 列表的端点。现在,端点将对每个 DTO 执行一些验证,如果这些 DTO 中的任何一
我将 Polly 与 .net Core 结合使用。我的 ConfigureServices 是: private static void ConfigureServices() { var
我正在使用 .NET 5 并希望使用 Polly 在重试时更改请求的查询字符串。背景 - 我有一个固定的每分钟请求配额,这是我的 IP 地址所允许的。如果超过限制,我会得到一个特定的 4xx 状态代码
Polly 中是否有办法重试除指定异常之外的所有异常。例如: var p = Policy .Handle(e => !(e.NativeErrorCode == 1)) .Or()
我们正在考虑使用 Polly 作为我们的故障转移库。 我们在 kubernetes 环境中运行我们的应用程序。例如,我们无法保证针对特定服务运行重试尝试的 pod 将存活足够长的时间以使请求成功。如果
我正在尝试使超时策略正常工作。我在集成 api 时有以下需求。 创建一个 http 请求来调用 endpoint1 并传递 transactionID 并捕获结果 如果 http 请求在 20 秒内没
在启动过程中,我基本上添加了一个 HttpClient,如下所示: services.AddHttpClient().AddPolicyHandler(GetRetryPolicy()); publi
在策略定义中,我希望能够在运行时禁用或启用该策略,而不是在调用站点中进行,因为我可能有多个调用站点。 这是我目前的方法? private RetryPolicy GetRetryPolicy() {
我对波利很陌生。我做了一些研究,但仍然无法确定是否/如何仅在请求失败时以优雅的方式使用 Polly 来使用 chached 值。例子: 服务 A 想通过 http 从服务 B 获取数据。我总是想获取最
我正在使用 AWS Polly 服务进行文本转语音。但是如果文本包含一些特殊字符,它会返回错误的开始和结束编号。 例如,如果文本是:“Böylelikle”,它返回:{"time":6,"type":
我试图重试失败的操作 3 次。 我正在使用 Polly 进行重试操作。 我想在重试操作失败的情况下获得异常并重试 2 次,依此类推。 return await Policy .H
我已经阅读了 Polly 库的文档和示例,它真的很棒而且易于使用!! 就我而言,我想将所有异常分为 3 种类型:临时、永久和日志。现在,我想要一段代码,负责通过使用 Polly 库进行等待和重试来处理
我在 PolicyRegistry 中有以下政策可以在全局范围内重复使用: var fallbackPolicy = Policy .Handle().OrInner()
我正在尝试检查 Polly 的简单 RetryForever class Program { public static void Main() {
我已经阅读了 Polly 库的文档和示例,它真的很棒而且易于使用!! 就我而言,我想将所有异常分为 3 种类型:临时、永久和日志。现在,我想要一段代码,负责通过使用 Polly 库进行等待和重试来处理
我在 PolicyRegistry 中有以下政策可以在全局范围内重复使用: var fallbackPolicy = Policy .Handle().OrInner()
我正在使用一个非常不稳定的 API。有时我会收到 500 服务器错误 和 Timeout,有时我也会收到 500 服务器错误,因为我给它提供了它无法处理的输入 SqlDateTime overflow
我正在尝试检查 Polly 的简单 RetryForever class Program { public static void Main() {
我想执行某个操作,如果失败3次则返回null。 Polly 中类似的东西将是完美的: var results = await Policy> .Handle() .RetryAsync
我是一名优秀的程序员,十分优秀!