不同服务器上的 Django 和 celery,一旦任务完成,celery 能够向 django 发送回调

Posted

技术标签:

【中文标题】不同服务器上的 Django 和 celery,一旦任务完成,celery 能够向 django 发送回调【英文标题】:Django and celery on different servers and celery being able to send a callback to django once a task gets completed 【发布时间】:2016-12-25 08:29:26 【问题描述】:

我有一个 django 项目,我在其中使用 celery 和 rabbitmq 来执行一组异步。任务。所以我计划的设置是这样的。

    Django 应用程序在一台服务器上运行。 Celery worker 和 rabbitmq 从另一台服务器运行。

我最初的问题是,如何从位于另一台服务器上的 celery 任务访问 django 模型?

假设我无法访问 Django 模型,有没有办法在任务完成后向 Django 应用程序发送回调传递值,以便我可以根据值更新 Django 的数据库通过了?

【问题讨论】:

【参考方案1】:

关于您的第一个问题,从工作人员的服务器访问 django 模型:

您的 django 应用程序必须在 Server A(服务用户)和 Server B(托管 celery worker)上都可用

关于第二个问题,根据值更新数据库。你的意思是异步任务的结果吗?如果是这样,那么您有两个选择:

假设您有权访问数据库,您可以从任务本身中保存您需要保存的任何内容。 您可以使用 Celery 官方文档中关于 Keeping Results 的结果后端(其中一个是通过 Django ORM)

【讨论】:

您对我的第二个问题的第二个解决方案,不使用结果后端并从任务中获取返回的结果使整个过程同步,有没有办法异步执行?? 它不是同步的,因为您不必在任务运行时等待。当然,只有在结果准备好后才能获取结果,但这并不能使其成为同步过程。【参考方案2】:

我在我的应用程序中使用了以下设置:

    任务从 Django 启动 - 从模型实例中提取信息并作为字典传递给任务。注意 - 这将是更多的未来证明,因为 Celery 4 将默认为 JSON 编码 远程服务器运行任务并创建结果字典 然后远程服务器调用更新任务,该任务仅由 Django 服务器上的工作人员监听。 Django worker 读取结果字典并更新模型。

Django worker 监听一个单独的队列,这不是绝对必要的。不使用结果后端 - 只需将所需的数据传递给任务

【讨论】:

以上是关于不同服务器上的 Django 和 celery,一旦任务完成,celery 能够向 django 发送回调的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 上的 Heroku、Django 和 celery

Celery:如何用不同的工人区分不同的环境?

不同数据库上的 Django 应用程序模型

Heroku 上的 Celery、RabbitMQ 和 Django:达到内存限制

Elastic Beanstalk 上的 Django 中的定期任务(可能使用 celery beat)

Django 和 Celery 的示例:周期性任务