Mule 4.4 Anypoint MQ订阅者断路器未触发问题排查
问题:Anypoint MQ订阅者断路器未触发排查
我正在使用Mule 4.4实现断路器模式,从Anypoint MQ队列消费消息后调用下游API,配置代码如下:
<flow name="create-emp-flow"> <anypoint-mq:subscriber doc:name="Subscriber - Create user" config-ref="Anypoint_MQ_Configuration" destination="emp.create.queue}" acknowledgementMode="AUTO"> <redelivery-policy maxRedeliveryCount="1"/> <anypoint-mq:circuit-breaker tripTimeout="150000" onErrorTypes="HTTP:INTERNAL_SERVER_ERROR,MULE:UNKNOWN" errorsThreshold="3"/> </anypoint-mq:subscriber> <http:request method="GET" doc:name="HACK - Mock CALL return a ISE500" config-ref="MOCK_Request_Configuration" path="/emp" > <http:response-validator > <http:success-status-code-validator values="200" /> </http:response-validator> </http:request> <error-handler > <on-error-continue enableNotifications="true" logException="true" doc:name="On Error Continue" type="MULE:REDELIVERY_EXHAUSTED"> <anypoint-mq:publish doc:name="Publish to DLQ" config-ref="Anypoint_MQ_Configuration" destination="emp.dlq" /> </on-error-continue> <on-error-propagate enableNotifications="true" logException="true" doc:name="On Error Propagate" > <logger .../> </on-error-propagate> </error-handler> </flow>
流程步骤:
- 消费消息(配置maxRedeliveryCount=1);
- 调用HTTP端点(故意返回500 ISE错误);
- HTTP调用返回ISE时,抛出HTTP:INTERNAL_SERVER_ERROR异常,符合断路器触发的错误类型。消息重传1次失败后触发MULE:REDELIVERY_EXHAUSTED,被发布到DLQ,此阶段表现正常。但发布多条消息后,达到3次错误阈值时,断路器未触发,后续消息仍被消费,未按预期在2.5分钟内停止消费。
注:我需使用<redelivery-policy maxRedeliveryCount="1"/>,而非Anypoint MQ队列默认的最大投递次数(10次),请问为何断路器未生效?
解答
核心原因
- 异常统计范围不匹配:Anypoint MQ订阅者的断路器仅统计未达到重传上限时抛出的、匹配监听类型的异常。当前逻辑中,HTTP错误触发重传1次后就进入
MULE:REDELIVERY_EXHAUSTED,并被on-error-continue处理,这个异常不在断路器监听的HTTP:INTERNAL_SERVER_ERROR,MULE:UNKNOWN范围内,因此断路器从未统计到符合条件的错误,自然不会触发跳闸。 - 语法错误:订阅者的
destination属性存在多余的}(destination="emp.create.queue}"),会导致配置解析异常,需先修正。
解决方案
1. 修正配置语法错误
将订阅者的destination属性修正为:
destination="emp.create.queue"
2. 调整错误处理逻辑
修改错误处理器,让HTTP:INTERNAL_SERVER_ERROR异常在重传耗尽前被订阅者的断路器捕获统计:
<error-handler > <!-- 仅处理重传耗尽的情况,将消息转发到DLQ --> <on-error-continue enableNotifications="true" logException="true" doc:name="On Error Continue" type="MULE:REDELIVERY_EXHAUSTED"> <anypoint-mq:publish doc:name="Publish to DLQ" config-ref="Anypoint_MQ_Configuration" destination="emp.dlq" /> </on-error-continue> <!-- 传播HTTP内部错误和未知错误,让订阅者断路器捕获并计数 --> <on-error-propagate enableNotifications="true" logException="true" doc:name="On Error Propagate" type="HTTP:INTERNAL_SERVER_ERROR,MULE:UNKNOWN"> <logger message="HTTP call failed, circuit breaker count incremented" level="ERROR"/> </on-error-propagate> </error-handler>
3. 逻辑验证
- 当HTTP调用返回500时,
HTTP:INTERNAL_SERVER_ERROR异常被传播到订阅者层面,断路器会统计该错误并计数; - 累计达到3次错误阈值后,断路器触发跳闸,在2.5分钟内停止消费新消息;
- 当消息重传达到1次上限后,触发
MULE:REDELIVERY_EXHAUSTED,消息被发布到DLQ,符合业务需求。
内容的提问来源于stack exchange,提问作者boomslaw
相关产品推荐
相关产品推荐

