【问题标题】:Spring Integration issue on RabbitMQ cluster restartRabbitMQ 集群重启时的 Spring 集成问题
【发布时间】:2016-08-30 07:29:10
【问题描述】:

我们的系统中有几个 RabbitMQ 队列,我们​​使用 Spring Integration amqp:inbound-channel-adapter 来消费消息。 Spring 应用程序在 5 个 JBoss 节点上运行(不在集群中)

RabbitMQ 端是一个带有负载均衡器的两个集群节点,具有持久队列,在应用程序端监听器定义非常简单,连接工厂定义如下:

<rabbit:connection-factory id="amqpConnectionFactory" username="${orts.rabbitmq.username}" password="${orts.rabbitmq.password}"
host="${orts.rabbitmq.endpoint}" />

还有几个 inbound-channel-adapter 定义如下:

<amqp:inbound-channel-adapter id="artiqAmqpInboundChannelAdapter"
  channel="artiq.queued.action.filter.outbound.channel" error-channel="artiq.recovery.router.channel"
connection-factory="amqpConnectionFactory" header-mapper="amqpHeaderMapper"
  queue-names="ortsArtiqQueue" />

当出于某种原因(即部署新配置)我们必须重新启动 RabbitMQ 集群时,我们遇到了意外行为,重新启动后,一个或多个侦听器停止消费消息,我们必须重新启动 JBoss 节点以恢复。

请注意,此行为未绑定到特定队列,每次受影响的队列可能不同。 另请注意,部署的新配置不会修改任何现有队列(例如,当我们添加新队列时)

【问题讨论】:

    标签: spring rabbitmq spring-integration spring-rabbit


    【解决方案1】:

    监听器停止消费消息,我们必须重启 JBoss 节点才能恢复。

    根据我的经验,此类问题总是因为侦听器容器线程“卡”在适配器下游的某些代码中。

    为了调试,下次发生时进行线程转储(例如使用jstack)并查看消费者线程在做什么。

    听起来这不是您的问题,但我们最近遇到了fix a bug,这在向现有侦听器容器添加/删除队列时导致了类似的问题。如果您不这样做,那么该修复将无济于事;您需要查看线程转储以了解发生了什么。

    【讨论】:

    • 嗨@Gary,感谢您的快速回复,我们正在努力在我们的暂存环境(即兔子集群而不是单个节点)上设置相同的基础架构来重现问题,这需要一段时间,所以我会在我们复制它后尽快回复更多信息
    • 我怀疑 rabbitmq 是否在集群中是问题所在;更有可能是由于生产量增加 - 可能是下游组件中的一些线程安全问题导致线程挂起。
    • 真的有可能,我只是想在一个尽可能接近生产环境的环境中工作以包含所有因素,不会花费太长时间,到目前为止似乎我们只有问题当“接触” RabbitMQ 时,我们不会太频繁地这样做
    • 嗨@Gary,因为我们也遇到了来自 PHP 客户端的 RabbitMQ 类似问题,所以我们将调查更多地转移到 RabbitMQ 方面,我们正在审查我们的基础设施设置,我会回来提供一些消息尽快
    • 嗨@Gary,我已经能够在我们的暂存环境中重现该问题。我对 RabbitMQ 连接工厂配置做了一个小改动,使用地址而不是主机和 RabbitMQ 节点的两个 IP,并收集了停止和启动 RabbitMQ 节点之前和之后的转储,以及每个 RabbitMQ 的 JBoss 服务器的 netstat 输出开始/停止,我如何分享它们? (数据量很大)
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多