异步微服务的断路器..?
Circuit breaker for asynchronous microservices..?
有一个 ActiveMQ 队列 (QueueA
)。服务 (MyService
) 订阅消息、处理消息并将消息发送到另一个 ActiveMQ 队列 (QueueB
)。
QueueA -> MyService -> QueueB
考虑 QueueA
中有数千条消息的场景。与此同时,QueueB
下线。如果一定数量的消息(比如 100 条)在向 QueueB
发送消息时连续失败,我想停止处理。它应该在特定时间段内测试滚动 window(例如,100 条连续消息在 60 秒内失败)并从 QueueA
停止消费。然后它应该通过再发送一条消息来测试服务是否在 15 分钟左右后启动。如果仍然失败,请再次停止从 QueueA
消费 15 分钟。
现在,所有消息都出错了,我们必须重新处理每条消息。有一个恢复机制,但由于当前架构的限制,恢复机制正在超载。
这有什么模式吗?它是同一个断路器吗(我在同步上下文中知道它)。如果是这样,不确定 Java / Spring Boot / Apache Camel 中是否有解决方案。是的,这就是我们目前所处的技术栈。即使您可能不了解该特定技术平台,该模式的任何指南也会有所帮助。
我还在 Whosebug 中阅读了以下问题。
感谢您花时间帮助我解决这个问题。
查看 ThrottlingExceptionRoutePolicy
类型的 Camel RoutePolicy,它基于 CircuitBreakerLoadBalancer
.
使用此策略应该允许您在电路处于打开状态时停止从端点消费(与标准电路行为相比:绕过服务调用,并回退到另一个响应)。
@Bean
public ThrottlingExceptionRoutePolicy myCustomPolicy() {
// Important: do not open circuit for this kind of exceptions
List<Class<?>> handledExceptions = Arrays.asList(MyException.class);
return new ThrottlingExceptionRoutePolicy(failureThreshold, failureWindow, halfOpenAfter, handledExceptions);
}
from("jms:queue:QueueA")
.routePolicy(myCustomPolicy)
.to("mock:MyService")
有一个 ActiveMQ 队列 (QueueA
)。服务 (MyService
) 订阅消息、处理消息并将消息发送到另一个 ActiveMQ 队列 (QueueB
)。
QueueA -> MyService -> QueueB
考虑 QueueA
中有数千条消息的场景。与此同时,QueueB
下线。如果一定数量的消息(比如 100 条)在向 QueueB
发送消息时连续失败,我想停止处理。它应该在特定时间段内测试滚动 window(例如,100 条连续消息在 60 秒内失败)并从 QueueA
停止消费。然后它应该通过再发送一条消息来测试服务是否在 15 分钟左右后启动。如果仍然失败,请再次停止从 QueueA
消费 15 分钟。
现在,所有消息都出错了,我们必须重新处理每条消息。有一个恢复机制,但由于当前架构的限制,恢复机制正在超载。
这有什么模式吗?它是同一个断路器吗(我在同步上下文中知道它)。如果是这样,不确定 Java / Spring Boot / Apache Camel 中是否有解决方案。是的,这就是我们目前所处的技术栈。即使您可能不了解该特定技术平台,该模式的任何指南也会有所帮助。
我还在 Whosebug 中阅读了以下问题。
感谢您花时间帮助我解决这个问题。
查看 ThrottlingExceptionRoutePolicy
类型的 Camel RoutePolicy,它基于 CircuitBreakerLoadBalancer
.
使用此策略应该允许您在电路处于打开状态时停止从端点消费(与标准电路行为相比:绕过服务调用,并回退到另一个响应)。
@Bean
public ThrottlingExceptionRoutePolicy myCustomPolicy() {
// Important: do not open circuit for this kind of exceptions
List<Class<?>> handledExceptions = Arrays.asList(MyException.class);
return new ThrottlingExceptionRoutePolicy(failureThreshold, failureWindow, halfOpenAfter, handledExceptions);
}
from("jms:queue:QueueA")
.routePolicy(myCustomPolicy)
.to("mock:MyService")