有一个ActiveMQ队列(QueueA
(。服务(MyService
(订阅消息,对其进行处理,并将消息发送到另一个ActiveMQ队列(QueueB
(。
QueueA -> MyService -> QueueB
假设QueueA
中有数千条消息。同时,QueueB
出现故障。如果在向QueueB
发送消息时,有一定数量的消息(比如100条(连续失败,我想停止处理。它应该在一定的时间段内测试滚动窗口(例如,60秒内连续100条消息失败(,并停止从QueueA
消耗。然后,它应该通过再发送一条消息来测试服务是否在15分钟左右后启动。如果仍然失败,请再次停止从QueueA
消费15分钟。
现在,所有的消息都出错了,我们必须重新处理每一条消息。有一个恢复机制,但由于当前架构的限制,恢复机制正在过载。
这有什么模式吗?它是同一个断路器吗(我在同步上下文中知道它(。如果是这样的话,不确定Java/Spring Boot/Apache Camel中是否有解决方案。是的,这就是我们目前使用的技术堆栈。即使您可能不了解这个特定的技术平台,任何模式指南也会有所帮助。
我还阅读了StackOverflow中的以下问题。
断路器模式是否也适用于异步请求?
谢谢并感谢你花时间帮助我。
查看基于CircuitBreakerLoadBalancer
的ThrottlingExceptionRoutePolicy
类型的Camel RoutePolicy。
使用此策略应允许您在电路处于打开状态时停止从端点消耗(与标准电路行为相比:绕过服务调用,回退到另一个响应(。
@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")