1

有一个 ActiveMQ 队列 ( QueueA)。服务 ( MyService) 订阅消息、处理它并将消息发送到另一个 ActiveMQ 队列 ( QueueB)。

QueueA -> MyService -> QueueB

考虑一个有数千条消息的场景QueueA。同时,QueueB是下来。如果在向QueueB. 它应该在特定时间段内测试滚动窗口(例如,100 条连续消息在 60 秒内失败)并停止从QueueA. 然后,它应该通过再发送一条消息来测试服务是否在 15 分钟左右后启动。如果仍然失败,QueueA请再次停止消费 15 分钟。

现在,正在发生的事情是所有消息都出错了,我们必须再次重新处理每条消息。有一种恢复机制,但由于当前架构的限制,恢复机制变得超负荷。

这有什么模式吗?它是同一个断路器吗(我在同步上下文中知道它)。如果是这样,不确定 Java / Spring Boot / Apache Camel 中是否有解决方案。是的,这就是我们目前使用的技术堆栈。即使您可能不了解此特定技术平台,该模式的任何指南也会有所帮助。

我还在 StackOverflow 中阅读了以下问题。

断路器模式是否也适用于异步请求?

感谢并感谢您花时间帮助我。

4

1 回答 1

1

查看ThrottlingExceptionRoutePolicy基于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")
于 2021-06-01T09:43:49.720 回答