问题标签 [resiliency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Polly CircuitBreaker 在电路断开时更改 HttpClient 基地址以继续执行请求
我现在有什么?
目前,我有一个配置了RetryAsync
策略的客户端,该策略使用主地址并在发生故障时切换到故障转移地址。连接详细信息从机密管理器中读取。
我想达到什么目标?
一般来说
我的客户可以使用主服务或故障转移服务。当主服务器关闭时,使用故障转移直到主服务器备份。当两者都关闭时,我们会收到警报,并且可以通过秘密管理器动态更改服务地址。
在代码中
现在我还想介绍一个CircuitBreakerPolicy
并将这两个策略链接在一起。我正在寻找一种封装的配置,并且在客户端级别而不是在使用该客户端的类上处理故障。
场景解释
让我们假设有一个断路器策略包装在具有单个客户端的重试策略中。
断路器配置为在主基地址上的瞬态错误尝试失败 3次后断开电路60 秒。- 地址从主地址更改为故障转移。OnBreak
重试策略配置为处理BrokenCircuitException
,并重试一次,并将地址从主更改为故障转移以继续。
- 主地址请求 - 500 代码
- 主地址请求 - 500 代码
- 主地址请求 - 500 代码(连续 3 次失败)
- 断路60秒
- 对主地址的请求 -
BrokenCircuitException
被重试策略捕获,调用故障转移 - 对主地址的请求 -
BrokenCircuitException
被重试策略捕获,调用故障转移 - 对主地址的请求 -
BrokenCircuitException
被重试策略捕获,调用故障转移 - 对主地址的请求 -
BrokenCircuitException
被重试策略捕获,调用故障转移 - (60 秒后)电路半开 - (此处可以再断开 60 秒或打开 - 假设打开)
- 主地址请求 - 200 代码
如本文所述,有一个解决方案是使用包装在回退中的断路器,但正如您在那里看到的,默认和回退的逻辑是在类中实现的,而不是在客户端级别上实现的。
我想
改写为
我读了什么?
我尝试了什么?
我尝试了几种不同的场景来链接断路器策略并将其与重试策略相结合,以在启动文件中的客户端杠杆上实现预期目标。最后一个状态如下。这些策略按照重试能够捕获 a 的顺序进行包装BrokenCircuitException
,但情况并非如此。在消费者类上抛出异常,这不是预期的结果。虽然RetryPolicy
被触发了,但是还是抛出了消费者类上的异常。
我省略了方法,OnBreak
因为它们只是打印一些消息。OnReset
OnHalfOpen
更新:从控制台添加了日志。
'CircuitBreakerPolicy.exe'(CoreCLR:clrhost):加载'C:\ Program Retries on broken circuit 异常抛出:System.Private.CoreLib.dll中的'System.AggregateException'
更新 2:使用配置了策略的客户端向类添加了参考 URL
更新 3:该项目已更新,以便WeatherService2.Get
以所需的方式实施工作:当主要服务不可用时,电路中断,使用故障转移服务直到电路关闭。这将是这个问题的答案,但是我想探索一个解决方案,WeatherService.Get
在Startup
.
在上面的日志中可以看到Exception thrown: 'System.AggregateException' in System.Private.CoreLib.dll
断路器抛出了哪些 - 这是不期望的,因为有重试包装断路器。
spring-retry - 什么是最好的框架 Spring Retry 或 Resilience4j Retry?
我们有以下两个框架可用于实现弹性重试。
- 春季重试(https://github.com/spring-projects/spring-retry)
- Resilience4j 重试(https://resilience4j.readme.io/docs/retry)
没有找到任何比较文档。
以上两个中最好的框架是什么,为什么?
c# - Polly 回退操作未引发指定的异常。发生了什么?
鉴于此代码尝试调用AuthenticationManager.Authenticate()
10 次,然后在 10 次CustomException
尝试失败后抛出:
为什么CustomException
没有从后备动作中抛出?正确的方法应该是什么?
c# - 将参数发送到 Polly 中的后备操作
我正在尝试使用 Polly 库和 Fallback 策略执行请求并返回带有 2 个执行器的响应。到目前为止,这是我的代码:
这段代码的问题是我不能在这一行上放一个 Request 参数:
.Fallback((request) => GetResponseFallback(request));
由于错误,代码将无法编译:
“无法从 'System.Threading.CancellationToken' 转换为 'PollyPOC.Request'”
如何使代码编译并告诉回退策略该操作将接收Request
到该操作的参数GetResponseFallback
?
resilience4j - Resilience4j 重试 - 内存消耗
我在 Spring Boot 2.x 中使用 Resilience4j 使用 Retry 和断路器模块对内存和 cpu 有什么影响?
另外,如果我有 2000 个事件/秒传入每个有效负载大约 10Mb,并且我将重试的等待持续时间保持为 15 秒,指数退避乘数为 2,那么对内存的影响是什么?我有 8Gb 的应用程序内存
kubernetes - 遵循传奇模式的微服务中的非自愿中断/ SIGKILL 处理
我应该设计我的微服务来处理硬件故障等非自愿中断吗?这些中断是否频繁到足以在 AWS 托管 EKS 集群上运行的服务中处理。
我是否应该考虑在服务中进行一些设计更改以使用诸如在每个步骤中持久化数据之类的方法来处理意外的 SIGKILL,还是将其视为过度工程?
如果是
a) 通常在 1 秒内响应的安静服务(遵循 saga 模式),您会建议使用什么标准方法来处理这些非自愿中断。b) 在 1 小时内处理 1GB 大文件的服务。
circuit-breaker - 断路器 - 我应该将电路状态存储在远程配置(Redis)中还是应该是实例级别?
我只是想知道应该如何为数据库实现断路器。
如果断路器处于实例级别,则可能有 10 或 20 个实例,并且所有这些实例都需要很长时间才能触发。
我是否应该考虑远程存储电路的状态(Redis),如果电路状态发生变化,它可以广播电路的状态?
这个想法背后的利弊是什么?