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

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

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

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

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

【问题讨论】:

    标签: python django asynchronous rabbitmq celery


    【解决方案1】:

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

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

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

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

    【讨论】:

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

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

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

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

    【讨论】: