Celery 任务之间复杂的依赖关系和关系

问题描述 投票:0回答:0

我正在通过 Classroom API 在基于 Django REST 的 LMS 和 Google Classroom 之间进行集成。

使用信号,当某些操作在我的 LMS 中发生时,我从“集成类”调度特定操作,最终触发对 Classroom API 的 API 调用。

我将集成类方法作为 Celery 任务运行。我不想在我的集成类中编写与 Celery 任务相关的逻辑,以便将业务逻辑与与执行方法相关的逻辑分开,所以我创建了一个任务来接收方法名称和kwargs 并使用给定的 kwargs 运行该方法。

由于集成类的方法接受模型实例作为参数,我还通过将它们转换为 pk 并在任务内部查询它们来执行参数的“(un)编组”:

调度功能:https://github.com/Evo-Learning-project/sai_evo_backend/blob/classroom_integration/integrations/registry.py#L10

任务:https://github.com/Evo-Learning-project/sai_evo_backend/blob/classroom_integration/integrations/classroom/tasks.py#L20

这里是问题:

一些任务依赖于之前成功运行的其他任务;但是,这些任务不会一起运行。

我举个例子:当一个学生在我的 LMS 中注册了一门课程时,他们也同时注册了 Classroom 上的配对课程。稍后,当学生参加我的 LMS 中的考试时,它与课堂上的 courseWork 项目配对,他们的 studentSubmission 更新为包含链接附件,链接到我的 LMS 上的参与。

问题是:如果用户没有注册 Classroom 课程,studentSubmission 可能不存在(Classroom 会自动为每个注册的学生创建一个提交,并且不允许直接创建提交)。

所以,在某种程度上,更新 studentSubmission 的任务取决于注册学生成功运行的任务。所以这是第一个问题。

相关问题:假设注册任务失败,因此,studentSubmission 更新任务也失败。如果稍后我能够在课堂上成功注册学生,我希望能够重试提交更新任务。

解决这些问题的合理方法是什么?

django celery google-classroom
© www.soinside.com 2019 - 2024. All rights reserved.