问题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:如果有网络中断,断路器已经达到exceptionsAllowedBeforeBreaking数,进入开放状态并等待持续时间,则电路将为新的请求开放...
经过durationOfBreak之后,电路将转换到半开状态,在此期间允许进行一次尝试调用(在当前的实现中)。
...但是那些已经发送的会抛出异常?
a.如果存在网络中断或服务关闭,并且期望的行为是在网络恢复或服务再次启动时重试请求,则需要执行RetryForever。实际上会有很多阻碍,对吗?
Polly策略只管理执行路径上发生的事情,而不知道是否存在类似的并行执行。因此,是的,如果存在retryForever
,并且如果您希望在连接丢失的情况下在该retryForever
中循环大量调用,则存在内存/资源膨胀的风险,因为在holding模式中有许多操作。要知道这是否是您的应用html" target="_blank">程序/体系结构的一个重要关注点,您需要在代表性环境中进行试验。
有没有更好的办法?
我今天使用应用程序容器/媒体维基泊出程序映像部署了MediaWiki的一个实例,我现在遇到了一个新问题,我找不到任何线索。尝试使用以下命令附加到媒体维基前端容器后: 由于我忽略的原因,它在我的配置中回答< code >终止,并尝试: 我确实收到了一些接近错误消息的内容: 这是我的新问题,因为这个容器永远不会停止重新启动。我可以看到,使用<code>docker ps-a。 问题是,我能够停止容器(
我有以下政策: 我是这样执行政策的: 问题是,当一个动作在开路上执行时,我在断路器回调中没有得到命中。 我希望通过策略放置一个API调用,要处理的异常类型为。政策定义有问题吗?为什么不叫断路器后备?
问题内容: 假设重新启动操作系统时,通过init.d或类似systemd的进程自动重启了Docker守护进程,那么重启一个或多个Docker容器的首选方式是什么?例如,我可能在反向代理或数据库服务器后面有许多Web服务器。 问题答案: CoreOS使用systemd来管理长期运行的服务: https://coreos.com/os/docs/latest/getting-started-with-
我试图利用Spring重试的重试和断路器机制。我试图在一个特定的函数中使用两个注释(@retryable和@circuitbreaker),但是Circuit Breaker不起作用。 另外,请告知是否有更好的方法来实现重试和断路器。PS:我既不想使用resilience4j也不想使用RetryTemplate。
根据入门指南(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