【问题标题】:Python Django Celery doesn't pick the task from the RabbitMQPython Django Celery 没有从 RabbitMQ 中选择任务
【发布时间】:2018-09-20 20:35:36
【问题描述】:

我在一个 Python Django 项目中工作。

它的一个功能是当有人从网络应用程序发送一些数据时,将它们转发到移动设备。

对于此功能,应用程序使用第三方服务GCMAmazon SNS。以下是应用程序的数据流。

Web 应用程序 ------> Amazon SNS --------> GCM --------> Android 设备

由于 Amazon SNS 端可能存在网络延迟、操作延迟和故障,Web 应用程序使用celery 作为调度器应用程序来实现异步、重试等行为。Celery 将 SNS 发送任务存储在队列中并异步处理它们.

Celery 作为调度程序使用 RabbitMQ 作为其代理应用程序。以下是数据流。

Web App --> Celery --> RabbitMQ --> Amazon SNS --> GCM --> Android 设备

发现与 Celery 和 RabbitMQ 组件相关的问题。

我们可以看到,当 celery 向 RabbitMQ 发送任务时,特定的 RabbitMQ 队列数增加,这意味着 celery 成功创建了任务对象并发送到队列。

但特定任务永远存在于队列中(队列数不会减少)并且不会继续将消息发送到 Amazon SNS,这意味着 Celery 不会再次从队列中选择存储的任务。

(我可以绕过 Celery 成功向 SNS 推送消息,这意味着与 SNS 的连接没有问题。)

这可能会导致celery 不从RabbitMQ 中挑选存储的任务?

【问题讨论】:

    标签: python rabbitmq django-celery


    【解决方案1】:

    您可能会弄清楚哪个是任务生产者,哪个是任务消费者。 Celery 是任务消费者,我认为网络应用程序是任务生产者。

    数据流看起来像 "WebApp -> RabbitMQ(Broker) -> Celery" 。

    所以,请确保 celery 代理配置正确,并且 celery worker 成功启动。

    更多信息请访问: Celery Broker Configuration

    如果你想使用 celery 作为周期性任务消费者。您可以访问celery periodic task

    【讨论】:

    • “所以,请确保 celery 代理配置正确”中的 celery 代理是什么意思。陈述 ?你是说 RabbitMQ 吗?
    • 是的,Celery broker 支持 redis、rabbitmq、mysql 等多个后端。broker 会将序列化的任务保存在 queue 中。生产者推送任务到代理,消费者从代理读取任务。
    • 借助您提供的要点,我可以解决问题。我不知道芹菜工作线程开始处理队列中的消息。所以,在我的设置中没有一个芹菜工人开始。因此,问题实际上与 celery 代理配置无关,但没有启动 celery worker。您能否编辑您的答案以强调这一点。如果是这样,我可以将您的答案标记为正确。
    猜你喜欢
    • 2011-07-18
    • 2011-07-17
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2015-08-08
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多