不同服务器和芹菜上的Django和芹菜能够在任务完成后向django发送回调

时间:2016-08-18 11:59:32

标签: python django asynchronous rabbitmq celery

我有一个django项目,我正在使用带有rabbitmq的芹菜来执行一组异步。任务。所以我计划的设置是这样的。

  1. 在一台服务器上运行的Django应用程序。
  2. 芹菜工人和从另一台服务器运行的rabbitmq。
  3. 我最初的问题是,如何从另一台服务器上的芹菜任务访问django模型?

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

2 个答案:

答案 0 :(得分:5)

关于你的第一个问题,从工人那里获取django模型'服务器:

您的django应用必须同时适用于服务器A (服务用户)和服务器B (托管芹菜工作者)

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

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

答案 1 :(得分:0)

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

  1. 任务从Django启动 - 信息从模型实例中提取并作为字典传递给任务。注意 - 这将是未来的证据,因为Celery 4将默认为JSON编码
  2. 远程服务器运行任务并创建结果字典
  3. 远程服务器然后调用仅由Django服务器上的工作者监听的更新任务。
  4. Django工作人员阅读结果字典并更新模型。
  5. Django工作者监听一个单独的队列,这不是绝对必要的。未使用结果后端 - 所需数据仅传递给任务