Polly 断路器已处理和未处理的异常

2024-04-20

我想使用 Polly 来实现断路器模式。

在文档中,有一个半开状态描述 https://github.com/App-vNext/Polly/wiki/Circuit-Breaker#half-open,上面写着:

  • 如果收到已处理的异常,则会重新引发该异常,并且电路会立即转换回打开状态,并在配置的时间跨度内再次保持打开状态。
  • 如果收到未处理的异常,电路将保持半开路状态。

我不确定我是否理解已处理异常和未处理异常之间的区别。我们正在描述一种情况,其中某个操作由策略运行并引发异常。

当他们说异常已处理时,他们的意思是在哪里处理异常?因为正如我们所说,该操作将其抛出,所以这是否意味着它未处理?

让我完全不明白半开状态什么时候保持半开状态,什么时候过渡到开状态。


当您定义断路器策略时,您可以定义断路器应考虑哪种类型的异常CB 实施 https://github.com/App-vNext/Polly/blob/52968c25f2e13e2708898174c15aafc9cb915020/src/Polly/CircuitBreaker/AsyncCircuitBreakerEngine.cs。换句话说,您可以列出那些应被视为执行失败并应计入连续失败计数的异常。

您可以使用以下组合来定义例外列表Handle<T> and Or<T>方法调用。

让我们通过一个简单的例子来仔细研究这个概念:

var retry = Policy
    .Handle<ArgumentException>()
    .Or<NotSupportedException>()
    .WaitAndRetry(5, _ => TimeSpan.FromSeconds(1),
        onRetry: (exception, delay, context) => Console.WriteLine($"{"Retry",-10}{delay,-10:ss\\.fff}: {exception.GetType().Name}"));

var circuitBreaker = Policy
    .Handle<ArgumentException>()
    .CircuitBreaker(2, TimeSpan.FromSeconds(1),
        onBreak: (ex, @break) => Console.WriteLine($"{"Break",-10}{@break,-10:ss\\.fff}: {ex.GetType().Name}"),
        onReset: () => Console.WriteLine($"{"Reset",-10}"),
        onHalfOpen: () => Console.WriteLine($"{"HalfOpen",-10}"));
  • The circuit breaker policy considers all ArgumentExceptions (including ArgumentNullException and ArgumentOutOfRangeException) as handled exception.
    • 这意味着,如果被调用的委托抛出这三个异常之一,那么它将增加连续失败计数,如果达到阈值,那么它将中断。
  • The retry policy is triggered in case of ArgumentException and in case of NotSupportedException as well.
    • 如果抛出其中任何一个,那么它将休眠一秒钟,然后尝试重新执行同一个委托。

因此,从断路器的角度来看,如果NotSupportedException被抛出而不是不会被考虑 >> 因此名称为未处理。

这就是我们的示例方法的实现方式,它将抛出一个ArgumentException or a NotSupportedException:

private static int count = 0;
private const int threshold = 3;
static void SampleCall()
{
    count++;
    if (count >= threshold) throw new NotSupportedException();
    throw new ArgumentException("Nothing");
}

政策的使用:

var strategy = Policy.Wrap(retry, circuitBreaker);

try
{
    strategy.Execute(SampleCall);
    Console.WriteLine("Succeeded");
}
catch (NotSupportedException)
{
    Console.WriteLine("Failed");
}

输出时threshold设置为 3

Retry     01.000    : ArgumentException
Break     01.000    : ArgumentException
Retry     01.000    : ArgumentException
HalfOpen
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Failed

CB 自身转移至HalfOpen然后说明SampleCall仅抛出NotSupportedExceptions。这不是由 CB 处理的,这就是它保留在HalfOpen state.

输出时threshold设置为 2

Retry     01.000    : ArgumentException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Failed

CB没有破发,因为没有连续两次破发ArgumentException。但重试确实触发了,因为它还处理NotSupportedException.

输出时threshold设置为 4

Retry     01.000    : ArgumentException
Break     01.000    : ArgumentException
Retry     01.000    : ArgumentException
HalfOpen
Break     01.000    : ArgumentException
Retry     01.000    : ArgumentException
HalfOpen
Retry     01.000    : NotSupportedException
Retry     01.000    : NotSupportedException
Failed

因为SampleCall确实扔了ArgumentException当 CB 处于HalfOpen状态这就是为什么 CB 认为已处理异常并将其自身从HalfOpen to Open.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Polly 断路器已处理和未处理的异常 的相关文章

随机推荐

  • 管理数据库更改的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 管理数据库更改的最佳方法是什么 无论数据库客户端的语言如何 我都需要有一个解决方案 另外 我希望能够在这些更改中使用特定的数据库功能
  • 将 Excel 文档转换为 wiki 标记 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以转换Excel http en wikipedia org wiki Microsoft Excel电子表格到媒体维基 htt
  • .NET MailMessage 类注入安全吗?

    我怀疑是否邮件留言 http msdn microsoft com en us library system net mail mailmessage aspx类受到保护电子邮件注入 http en wikipedia org wiki E
  • JS:反转数组,但仅反转原始数组 --> 错误:运行时没有输出

    我有以下问题 反转数组 编写一个接受数组并就地反转该数组的函数 该行为应该模仿本机 reverse 数组方法的行为 但是 您的反向函数应该接受要作为参数进行操作的数组 而不是作为该数组上的方法来调用 不要在您自己的实现中使用本机 rever
  • angularjs - 单击具有实际网址的链接时刷新

    我使用 RouteProvider 为我的 url 定义控制器和模板 当我单击与实际位置具有相同 URL 的链接时 没有任何反应 我想要reload 如果用户单击此类链接 即使位置未更改 也会调用该方法 换句话说 如果我将位置设置为相同的值
  • 通过nodejs服务器+socket.io从mp3文件同步流式传输音乐

    我的服务器上有一个 mp3 文件 我希望所有访问该网址的客户都能同步收听该音乐 That is 假设该文件播放 6 分钟 我在上午 10 00 开始播放这首歌 上午 10 03 发出的请求应从歌曲的第 3 分钟开始收听 我所有的客户都应该同
  • 带有属性占位符的 Spring Cloud AWS SQS SendTo 注释

    这个问题 https github com spring cloud spring cloud aws issues 65建议 SendTo 注释支持属性占位符 但我无法让它工作 这是我想要做的一些简化的代码片段 比尝试用文字解释更容易 我
  • Visual Composer 无法加载并给出 TypeError: _.template(...).trim is not a function

    我的视觉作曲家插件不起作用 它卡在加载页面上 它给出了一个错误 TypeError template trim 不是函数 错误出现在这行代码上 这个 controls template 模板 数据 vc template options t
  • 如何检测位图中的红色像素

    android中的getPixels 是上下左右读取像素 还是左右上下读取像素 基本上是按行或列读取 如果我想知道图片中的红色值较高的位置 我可以这样做吗 我假设它是按列读取的 Bitmap thumbnail Bitmap data ge
  • set_time_limit(0) 和“最大执行时间” PHP

    我有一个脚本 我已经设置了 set time limit 0 但仍然得到 Fatal error Maximum execution time of 90 seconds exceeded in home Feed php on line
  • Ajax.ActionLink 与 Html.ActionLink + Jquery.Ajax 调用

    我可以通过 Ajax ActionLink Getcustomers GetCustomers Customer 调用 asp net mvc 控制器 我可以使用 Html ActionLink 和 jquery ajax 调用执行相同的操
  • 使 PlaySound 非阻塞

    我一直在测试声音 我注意到PlaySound正在阻塞 即它会等到声音播放完毕才返回 include
  • 是否可以将 Promise 包装在生成器内?

    我正在尝试使用生成器创建一个承诺包装器 以便我可以执行以下操作 var asyncResult PromiseWrapper ajax 到目前为止 我一直在尝试 function PromiseWrapper promise return
  • 使用 angularJS 触发点击最近的 div

    嗨 我有以下代码 angular module myApp controller myController function scope scope clickedInput function setTimeout function ang
  • Linux用户空间线程、内核线程、轻量级进程

    我对所有这些实体以及它们在 Linux 中如何互连感到有点困惑 Unix 内部原理 一书指出lightweight process LWP 是内核支持的用户线程 并且该内核看不到进程内的线程 对于 Linux 来说仍然如此吗 据我了解 用户
  • 为什么调用成员函数不会调用该对象的 ODR-USE?

    Here in cppref http en cppreference com w cpp language initialization says 如果非内联变量 C 17 起 的初始化推迟到主 线程函数的第一条语句之后进行 它发生在第一
  • Matlab:在类中导入函数

    我在 Matlab 中有一个类文件 我使用包规范创建了 i 目录结构 MyPkg F1 F2 F3 fun m myc m 我的班级是myc并将其插入包装中MyPkg 一个功能fun保存在子包中F3在主要的一处 我想使用函数fun在我的课堂
  • 应用程序可以在 WIFI 上运行,但不能在 3G 上运行

    有两项活动 Main and Detail活动 Main Activity基本上是一个GridView Detail Activity基本上显示了单击项目的详细信息 我正在传递所选项目的 id pid 来自Main to the Detai
  • 如何删除neo4j中的所有索引?

    我想使用 cypher 批量删除所有存在的索引 可以吗 我正在使用 neo4j 3 4 7 DROP INDEX ON Label attributename 如果我在稍后阶段创建相同的索引 它会替换现有索引吗 删除所有索引和约束的快速方法
  • Polly 断路器已处理和未处理的异常

    我想使用 Polly 来实现断路器模式 在文档中 有一个半开状态描述 https github com App vNext Polly wiki Circuit Breaker half open 上面写着 如果收到已处理的异常 则会重新引