【问题标题】:RabbitMQ Connections not auto-closed when EC2 instances is stopped or teminated当 EC2 实例停止或终止时,RabbitMQ 连接不会自动关闭
【发布时间】:2015-11-10 18:39:16
【问题描述】:

我使用 python 的 Kombu (3.0.26) 和 librabbitmq 连接器连接到 EC2 实例上 AWS 中的 rabbitmq。当我启动和停止应用程序时,与兔子的连接会按预期出现并消失。当我再次使用 TERM 或 KILL 终止应用程序时,连接会在 rabbitmq 上按预期消失。

但是,如果我使用 AWS 控制台停止或终止实例,则连接将永久保留在 rabbitmq 上,直到我进入并强制关闭连接。

我也许可以通过在应用程序上添加 AMQP 心跳来解决这个问题,并弄清楚如何不断地 ping 应用程序仍然存在的服务器。但是,如果心跳没有及时通信,我有一些阻塞调用可能会过早地终止连接。我宁愿rabbitmq服务器只是找出TCP连接已死并关闭连接。

当 ec2 实例停止或终止时,是否有人遇到过连接挂起的问题?

【问题讨论】:

  • 嗨@jwieland。你找到解决办法了吗?我们也遇到了同样的问题
  • 我也面临同样的问题。

标签: python amazon-ec2 rabbitmq kombu


【解决方案1】:

我注意到在我们的 k8s 集群中终止 ec2 点实例时出现了同样的问题。

kombu                                  5.2.3
celery                                 5.2.3

看起来 celery 正在为任务消费者创建与 amqp 心跳的连接。但是,mingle consumer 等其他消费者没有心跳。

有一个设置broker_heartbeat,但设置它似乎并没有将心跳转发给其他消费者。最终,在kombu 的深处,有一个Transport 类和一个establish_connection。在这里我看到我可以通过设置中的传输选项进行代理,并且它们存在于所有连接的 amqp 协议级别。

# for celery projects
broker_transport_options = {"heartbeat": 40}

# for django + celery projects
CELERY_BROKER_TRANSPORT_OPTIONS = {"heartbeat": 40}

设置了心跳,当节点终止时,所有的连接最终都会从rabbitmq断开。

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 2013-05-31
    • 2015-12-20
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多