3

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

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

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

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

4

1 回答 1

0

当 ec2 现场实例在我们的 k8s 集群中终止时,我注意到同样的问题。

kombu                                  5.2.3
celery                                 5.2.3

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

rabbitmq 管理员连接

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

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

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

设置心跳后,当节点终止时,所有连接最终都会从 rabbitmq 中删除。

于 2022-01-20T22:09:45.187 回答