问题标签 [circuit-breaker]
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.
java - 如何在 Spring-Retry 中计算 CircuitBreaker 的正确超时?
我了解@CircuitBreaker
注释应该如何工作,但不确定resetTimeout
参数值。
我有一个应用程序每隔 10 秒就不断询问其他外部服务。每个请求可能需要 1-3 秒。默认的 3 次尝试就可以了,所以我想 40 秒openTimeout
应该没问题。我决定将 80 秒设置为resetTimeout
. 据我了解文档,如果 3 次故障将在 40 秒内发生,那么电路将在 resetTimeout 参数(80 秒)中指定的时间段内打开。
在测试期间,我注意到如果电路打开并且另一个请求进来,则不会调用外部服务。没关系,但我希望在resetTimeout
(80 年代)之后,将调用一个从未发生过的真正服务。
奇怪的是,如果电路打开并且在 resetTimeout(80s) 期间没有调用服务,那么电路将复位。恕我直言,弹簧应该比较当前时间和打开电路的故障,目前看起来它将当前时间与上次请求进行比较。
我误解了这个图书馆的想法吗?
服务:
测试:
我正在使用 osx 10.12.6、java 1.8.0_144 spring:4.2.3.RELEASE 和 spring-retry:1.2.1.RELEASE (我的同事也测试了 1.2.2,结果相同)
java - 断路器模式
回退方法和实际方法是否应该返回相同的返回类型。
我应该怎么做才能从回退方法返回字符串reading list
并从实际方法返回一些对象reliable
?
circuit-breaker - Polly 断路器没有被调用
我第一次尝试实施断路器,但它不起作用。后备政策有效,但我似乎无法达到断路器。我已经在不同的版本中尝试过这个,包括断路器的重试策略,但这似乎并不重要。我确定这是我错过的基本内容。
这是用于测试目的的代码的简化版本:
java - 使用 RetryPolicy 和 CircuitBreaker 进行故障保护会引发 CircuitBreakerOpenException
我正在尝试将重试策略与具有 Failsafe 的 CircuitBreaker 模式相结合,但是当尝试在电路打开并中断时出现 CircuitBreakerOpenException 异常。
https://github.com/jhalterman/failsafe
问题是通过将重试延迟设置为小于电路的关闭时间而产生的。
如何控制此异常,使重试策略不中断?我想这样做是因为我可以让多个同时实例向休息服务发起请求,并且重试不会中断。
我的代码:
我的结果:
spring - 带卡夫卡消费者的断路器
有没有办法使用基于Spring Kafka的消费者实现断路器模式。我想知道在实现我的 Spring kafka 消费者时,如果基于某些外部系统处理数据失败并引发网络错误,是否可以停止消费记录。但是,如果网络问题得到解决,消费者应该再次正常处理。
asynchronous - 将 Spring-REST 中的 @Async 方法转换为具有异步回退的异步 @HystrixCommand 方法
我有一个在我的@Service 类中标记为@Async 的方法。这将返回一个 Future 类型。
此方法基本上充当客户端,它调用另一个 URL(此处标记为 URL)中的服务。
我想将此@Async 方法转换为以下格式的异步@HystrixCommand 方法:
但是当我这样做时,它会在我的代码中引发以下错误:
对于return new AsyncResult<Object>() {...}
它说的那一行
构造函数 AsyncResult() 未定义。
当我要求 Eclipse 修复错误时,它会将requestString
Object 添加到构造函数参数中,即AsyncResult<Object>(requestString)
它还要求我@Override
从invoke()
方法中删除。
它说
new AsyncResult(){} 类型的方法 invoke() 必须覆盖或实现超类型方法。
但是在要求 eclipse 为我修复错误时,它删除了@Override
我的问题是如何将 @Async 方法变成异步 @HystrixCommand 方法而没有任何这些问题?
我还想为此方法实现异步回退,以防响应状态代码不是 200,向用户显示默认消息。
我该怎么做呢?
谢谢你。
microservices - 在 Hystrix 断路器中自定义触发回退的条件
我想根据我自己的标准(检查特定响应状态)触发 @HystrixCommand 方法的回退。
我的方法基本上充当客户端,它在另一个 URL(此处标记为 URL)中调用服务。
这是我的代码:
fallbackPerformOperation()
这会在响应状态码不是 200 即 response.getStatus()!=200 时触发回退方法。
fallback 方法返回一个字符串,告诉用户请求没有返回 200 的状态,因此它正在回退。
我想知道是否可以触发回退而不必在我的performOperation()
方法中显式抛出异常。
我可以用@HystrixProperty
吗?我知道人们主要将它用于超时和音量阈值,但我可以编写一个自定义@HystrixProperty
来检查响应状态是否在我的方法中为 200 吗?
http - 针对 HTTP 状态代码和其他异常使用 @HystrixProperty 超时触发回退
我的@Service 类中有一个用@HystrixCommand 标记的函数。
此方法充当客户端,向另一个服务 URL 发送请求并返回响应。
我想要做的是在响应状态代码不是 200 时触发回退功能。它还将触发任何其他异常(RuntimeExceptions 等)的回退。
我想通过使用@HystrixProperty 或@HystrixCommandProperty 来做到这一点。
我希望客户端 ping URL 并监听 200 响应状态,如果它在某个时间范围内没有返回 200 状态,我希望它回退。
如果它在一定时间内正常返回 200 状态,则不应触发回退。
我特别想使用@HystrixProperty或@HystrixCommandProperty,因此在方法内部执行检查以确保响应状态代码不是200,然后抛出异常是不可接受的。
通过扩展 HystrixCommand 接口工作而不是使用注释来创建我自己的命令?
任何我可以从这里开始的想法或资源都非常受欢迎。
java - Resilience4j 断路器环位缓冲区大小配置
我希望在 Web 应用程序中实现弹性4j 断路库。
我的应用程序与两个服务通信,每个服务每秒接收 20 到 150 个请求,具体取决于一天中的时间。Resilience4j 使您能够为每个断路器定义配置,从而可以配置阈值和环形缓冲区大小。
有关环形缓冲区大小和弹性 4j 与 netflix hystrix 实现的额外信息:
Hystrix 默认将执行结果存储在 10 个 1 秒的窗口桶中。如果超过 1 秒的窗口存储桶,则会创建一个新存储桶并丢弃最旧的存储桶。该库将执行结果存储在 Ring Bit Buffer 中,没有统计滚动时间窗口。成功调用存储为 0 位,失败调用存储为 1 位。Ring Bit Buffer 具有可配置的固定大小,并将位存储在 long[] 数组中,与布尔数组相比,它可以节省内存。这意味着 Ring Bit Buffer 只需要一个包含 16 个长(64 位)值的数组来存储 1024 个调用的状态。优点是该断路器可以开箱即用地用于低频和高频后端系统,因为在经过时间窗口时不会丢弃执行结果。
我的问题是,随着请求在每秒 20 到 150 之间波动,我如何确定环形缓冲区的最佳大小?如果有人问我同样的问题,我将如何证明我选择的数字是合理的?
如果我将环形缓冲区设置为 100,每秒 20 个请求将需要 5 秒才能填满,而在高峰时段填满不到 1 秒。我不确定我是否应该使用像 hystrix 这样的基于时间的实现,或者我是否可以使用弹性 4j 解决这个问题。
spring-cloud - Spring Cloud 断路器或 Hystrix
Hystrix 主要用于使用 Spring Cloud 构建的应用程序。话虽如此,一个应用程序可能有多个服务层。
例如亚马逊(亚马逊网站必须有多种服务,如登录、产品、购物车、订单、支付等)
客户端(例如 Web 用户)-> Web 应用程序 X -> 服务 A(它使用数据源 A)-> 服务 B(数据源 B)-> 服务 C(数据源 C)-> 服务 D(数据源 D)- > 服务 E(数据源 E)
在这种情况下,当服务 E 出现问题时,如何将其导航回客户端?Hystrix 在这里如何有助于了解服务 E 中的一项特定功能不可用?
如果该示例是错误的,那么 Hystrix 范围是否仅限于一个服务中的多个进程,而不是一个应用程序中使用的多个服务?话虽如此,上面的例子可以调整如下
客户端(例如 Web 用户)-> Web 应用程序 X -> 服务 A -> 内部服务 A 假设有进程 1 -> 进程 2 -> 进程 3 -> 进程 4-> 进程 5 并且进程 5 中的任何操作都失败了被导航回进程 1,然后返回客户端。
我的问题更多是关于在这里维护线程状态。
使用 try-catch 线程范围受限于每个服务(如果错误,请纠正我)。
Hystrix 如何在整个事务中维护线程状态?