当 RabbitMQ 消费者闲置一天时,那么消费者会被自动移除

问题描述

我面临以下有关 RabbitMQ 消费者的问题。

问题

当RabbitMQ消费者闲置一天后,消费者会被自动移除(可能是连接关闭了)。确切的问题是消费者脚本仍在运行。如果消费者已关闭,则应停止以下消费者脚本。消费者被静删除并且脚本仍在运行,因此除非我手动查看 RabbitMQ 控制台,否则在消费者关闭时我不会收到通知我有一些机制可以在脚本停止运行时发出通知,但是这里消费者被删除并且脚本仍在运行并且无法在消费者空闲一天时自动删除时收到通知

run.py(消费者脚本)

import pika
def main():
    parameters = pika.URLParameters(amqp_url)
    connection = pika.BlockingConnection(parameters)
    channel = connection.channel()
    channel.queue_declare(queue='hello')
    def callback(ch,method,properties,body):
        print(" [x] Received %r" % body)
    channel.basic_qos(prefetch_count=1)
    channel.basic_consume(queue='hello',on_message_callback=callback,auto_ack=False)
    print(' [*] Waiting for messages. To exit press CTRL+C')
    channel.start_consuming()
if __name__ == '__main__':
    main()

requirements.txt

pika=1.1.0

元数据

鼠兔版本:1.1.0

心跳:60s

脚本部署在 Kubernetes docker 容器中

项目结构

  • requirements.txt
  • 运行.py

DockerFile

FROM python:3.9-slim
workdir /consumer
ADD requirements.txt ./
RUN pip install --upgrade pip==20.2.4
RUN pip install -r requirements.txt
ADD . ./ 
CMD python run.py

解决方法

在我看来,一旦此容器启动,它就会以关闭容器不会撤消的方式创建或更改某些资源或状态。在我看来,这可能是 Pika 问题。我认为您的问题很可能与 this post 有关。在这种情况下,某种 close_connection() 可能会触发,但只是未能达到预期。

另一个问题可能是在关闭完成之前没有发送正确的关闭指令。在这种情况下,您可能需要自己发送这些说明。我建议您查看 PreStop Kubernetes LifeCycle Hook,它可以帮助您控制容器关闭过程。