我有一个django项目,在那里我使用芹菜与rabbitmq来执行一组异步。任务。所以我计划的设置是这样的。
- Django应用运行在一个服务器上。
- 芹菜工人和rabbitmq从另一个服务器运行。
我最初的问题是,我如何从另一个服务器上的芹菜任务访问django模型?
,假设我不能访问Django模型,有没有一种方法一旦任务完成,我可以发送回调到Django应用程序传递值,这样我就可以更新Django的数据库基于传递的值?
关于你的第一个问题,从工人服务器访问django模型:
你的django应用程序必须在服务器A(服务用户)和服务器B(托管芹菜worker)
上可用。关于你的第二个问题,基于值更新数据库。你是指异步任务的结果吗?如果是这样,那么您有两个选择:
- 你可以在任务本身中保存任何你需要保存的东西,假设你可以访问数据库。 你可以使用一个结果后端(其中一个是通过Django ORM),在芹菜的官方文档中提到的关于保持结果
我在我的应用程序中使用了以下设置:
- Task是由Django发起的——信息是从模型实例中提取出来的,并作为字典传递给Task。注:这将是未来的证明,因为芹菜4将默认使用JSON编码
- 远程服务器运行任务并创建结果字典
- 远程服务器然后调用一个更新任务,这个任务只被Django服务器上的worker侦听。
- Django worker读取结果字典并更新模型。
Django worker监听一个单独的队列,这不是严格必要的。没有使用结果后端——所需的数据只是传递给任务