【问题标题】:Celery Why Does Task Stay In Queue芹菜为什么任务留在队列中
【发布时间】:2023-10-03 17:17:01
【问题描述】:

所以我将 Celery 与 RabbitMQ 一起使用。我有一个注册用户的 RESTful API。我正在使用远程 Celery 工作人员异步发送注册电子邮件,以便我的 API 可以快速响应。

from .tasks import send_registration_email

def register_user(user_data):
    # save user to the database etc

    send_registration_email.delay(user.id)

    return {'status': 'success'}

这很好用。电子邮件以非阻塞异步方式发送(如果失败可以重试,这很酷)。问题是当我查看 RabbitMQ 管理控制台时。我可以看到 send_registration_email 创建了一个随机队列。比如:

可以看到任务已经成功执行了。那么为什么随机队列会永远留在 RabbitMQ 中呢?这是任务负载:

{"status": "SUCCESS", "traceback": null, "result": true, "task_id": "aad10877-3508-4179-a5fb-99f1bd0b8b2f", "children": []}

【问题讨论】:

    标签: python django rabbitmq celery amqp


    【解决方案1】:

    如果您在设置中配置了 CELERY_RESULT_BACKEND,则这是正常行为。请在此处查看:Celery result backend description

    您可以禁用结果后端,或减少每条消息的生命周期。

    【讨论】:

    • 是的。在此期间我已经想通了。我已将 ignore_result=True 添加到任务注释中。忽略结果是一个好习惯吗?我有很多任务没有返回任何结果(很多任务用于发送电子邮件、日志轮换、报告和维护任务等),所以我忽略了它们的结果。
    • 你读过其他 RabbitMQ 任务的结果吗?在这种情况下,我认为删除 RESULT_BACKEND 是更好的解决方案。
    • 我确实有从中读取结果的任务,所以我不能只关闭结果后端。实际上,我的整个 SOA 都在 AMQP 上运行。而不是 SOAP,我的服务通过 RabbitMQ / Celery 相互通信。