【问题标题】:Pause/Resume JMS Listener Using Hystrix Circuit Breaker使用 Hystrix 断路器暂停/恢复 JMS 侦听器
【发布时间】:2019-05-04 07:46:06
【问题描述】:

我们有一个 JMS 监听器,它从 MQ 中提取消息并将它们保存在数据库中。我的问题是在数据库关闭时暂时暂停 JMS 侦听器并在一段时间后再次恢复它的最佳方法是什么。

我的想法是在 db 操作周围使用 Spring Circuit Breaker 来监控其运行状况并回退到错误处理程序方法。这将有助于避免每次都等待数据库超时。但是,监听器仍在拉取消息并尝试保存它们,这会浪费 CPU 和网络。

有没有办法处理断路器命令事件,例如:开/半开/关?然后我可以在电路开路事件发生时将代码编写到stop JMS,并在电路半开事件发生时start JMS。

或者当依赖项失败时临时暂停 JMS 侦听器的最佳做法是什么?

注意:我们正在为侦听器使用 Spring Integration 消息驱动通道适配器。

【问题讨论】:

    标签: spring spring-integration spring-jms hystrix circuit-breaker


    【解决方案1】:

    JMS 监听器是一个Lifecycle bean 和 Spring Integration 中的 JMS 入站通道适配器。这意味着它们具有start()/stop() 方法,因此允许您在不停止应用程序上下文的情况下停止使用消息。

    关于断路器,我假设您正在谈论一种 spring-cloud 服务。如果是这样,那么您只需将 JMS 侦听器或适配器注入它的实现并调用它的 start/stop 方法。但这主要是为了引入断路器分布式微服务,这也意味着服务发现和其他高级功能。

    如果您只使用弹簧集成 (SI) 运行单个应用程序上下文来执行断路器,您可能希望从 here 所述的内部 SI 支持中受益。

    【讨论】:

    • 感谢您的回答。是的,JMS Listener 有停止/启动方法,但问题是如何将它与 Hystrix 断路器集成。我发现有一种方法可以获得 Hystrix 事件的通知,但是当它移动到“半开”状态时没有事件类型:stackoverflow.com/questions/39957791/…
    • 我不知道你为什么关心半开。当数据库连接不可用时,我将假设会有一些失败(异常)。如果您将其包装在 Hystrix 命令中,您将有一个选项来定义回退操作,您将在该操作中停止 JMS 侦听器。到那时,消息将停止发送。当数据库连接重新出现时,您重新启动侦听器,一切都恢复正常。想想看,你实际上甚至没有断路器的情况,因为我刚才描述的所有事情都可以在没有断路器的情况下实现,而且更简单。
    【解决方案2】:

    对于那些有同样问题的人,在检查了Hystrix Circuit Breaker库的代码后,我意识到首先没有任何机制来通知电路状态变化。其次,即使事件在那里,它也不能解决我的问题。因为,在睡眠窗口(电路打开时)之后的第一次尝试(服务调用)会达到半开状态。而对于我的情况,当 JMS 侦听器停止时,不会有任何下一次尝试/调用。

    最后,我开发了一个自定义断路器库,它在打开电路时启动定时器/调度器,并在定时器(睡眠窗口)触发时自动将电路移动到半打开状态。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2021-12-12
      • 2012-07-09
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多