当前位置: 首页 > 知识库问答 >
问题:

Polly断路器/重试在网络中断后自动重新启动查询

葛修真
2023-03-14

问题1:如果网络中断,断路器已达到exceptionsAllowedBeforeBreaking编号,进入open状态并等待DurationOfBreaking周期,则电路将为新请求打开,但已发送的请求将抛出异常?

问题2:如果期望的行为是重试那些有异常的请求,而不是断路器抛出异常,那么除了断路器策略之外,还需要实现重试策略。我对此的理解是,将发生问题1中的行为,然后将尝试重试。

a.如果存在网络中断或服务关闭,并且期望的行为是在网络恢复或服务再次启动时重试请求,则需要执行RetryForever。有没有更好的办法?实际上会有很多阻碍,对吗?

    const int maxRetryAttempts = 3;

    const int exceptionsAllowedBeforeBreaking = 2;
    const int pauseBetweenFailures = 2;
    readonly Policy retryPolicy = Policy
        .Handle<Exception>()
        .RetryAsync(maxRetryAttempts, (exception, retryCount) => System.Diagnostics.Debug.WriteLine($"Retry {retryCount}"));

    readonly Policy circuitBreakerPolicy = Policy
        .Handle<Exception>()
        .CircuitBreakerAsync(exceptionsAllowedBeforeBreaking: exceptionsAllowedBeforeBreaking,
                durationOfBreak: TimeSpan.FromSeconds(pauseBetweenFailures),
                onBreak: (e, span) => System.Diagnostics.Debug.WriteLine("Breaking circuit for " + span.TotalMilliseconds + "ms due to " + e.Message),
                onReset: () => System.Diagnostics.Debug.WriteLine("Trial call succeeded: circuit closing again."),
                onHalfOpen: () => System.Diagnostics.Debug.WriteLine("Circuit break time elapsed.  Circuit now half open: permitting a trial call."));
var response = await retryPolicy.WrapAsync(circuitBreakerPolicy).ExecuteAsync(() => this.client.SendAsync<TData, JObject>(message, cancel, jsonSerializer));

共有1个答案

华章横
2023-03-14

问题1:如果有网络中断,断路器已经达到exceptionsAllowedBeforeBreaking数,进入开放状态并等待持续时间,则电路将为新的请求开放...

经过durationOfBreak之后,电路将转换到半开状态,在此期间允许进行一次尝试调用(在当前的实现中)。

...但是那些已经发送的会抛出异常?

a.如果存在网络中断或服务关闭,并且期望的行为是在网络恢复或服务再次启动时重试请求,则需要执行RetryForever。实际上会有很多阻碍,对吗?

Polly策略只管理执行路径上发生的事情,而不知道是否存在类似的并行执行。因此,是的,如果存在retryForever,并且如果您希望在连接丢失的情况下在该retryForever中循环大量调用,则存在内存/资源膨胀的风险,因为在holding模式中有许多操作。要知道这是否是您的应用html" target="_blank">程序/体系结构的一个重要关注点,您需要在代表性环境中进行试验。

有没有更好的办法?

 类似资料:
  • 我今天使用应用程序容器/媒体维基泊出程序映像部署了MediaWiki的一个实例,我现在遇到了一个新问题,我找不到任何线索。尝试使用以下命令附加到媒体维基前端容器后: 由于我忽略的原因,它在我的配置中回答< code >终止,并尝试: 我确实收到了一些接近错误消息的内容: 这是我的新问题,因为这个容器永远不会停止重新启动。我可以看到,使用<code>docker ps-a。 问题是,我能够停止容器(

  • 我有以下政策: 我是这样执行政策的: 问题是,当一个动作在开路上执行时,我在断路器回调中没有得到命中。 我希望通过策略放置一个API调用,要处理的异常类型为。政策定义有问题吗?为什么不叫断路器后备?

  • 我试图利用Spring重试的重试和断路器机制。我试图在一个特定的函数中使用两个注释(@retryable和@circuitbreaker),但是Circuit Breaker不起作用。 另外,请告知是否有更好的方法来实现重试和断路器。PS:我既不想使用resilience4j也不想使用RetryTemplate。

  • 问题内容: 假设重新启动操作系统时,通过init.d或类似systemd的进程自动重启了Docker守护进程,那么重启一个或多个Docker容器的首选方式是什么?例如,我可能在反向代理或数据库服务器后面有许多Web服务器。 问题答案: CoreOS使用systemd来管理长期运行的服务: https://coreos.com/os/docs/latest/getting-started-with-

  • 根据入门指南(https://Resilience4j.readme.io/docs/get-started-3)和演示项目(https://github.com/Resilience4j/Resilience4j-spring-boot2-demo),我想自己测试它,创建一个更简单的测试应用程序。 代码如下:

  • 我用Inno Setup做了一个安装程序,在一些文件运行后我需要重启电脑,所以我用了这篇文章中的解决方案。 inno安装示例“CodePrepareToInstall”。iss运行良好,所以我使用了代码进行测试安装,但计算机重新启动后安装程序无法启动。 两个安装程序(inno demo和我的测试)都在“HKLM\Software\Microsoft\Windows\CurrentVersion\R