我有一个处理数据的服务。它是用Python(Django)编写的,并使用Celery使其异步。
处理我们的数据使用信用。您还可以购买积分,这是由Stripe-webhook触发的。
涉及信用变更的每项操作都列为"工作"。我有2个Celery任务,都将作业添加到某个JobId数据库。
我使用" job"用于跟踪在哪个工作中处理哪些数据的概念。
models.py:
class JobId(models.Model):
user = models.ForeignKey(User, blank=True, null=True, default=None)
job_time = models.DateTimeField(auto_now_add=True)
# current credit level
credits = models.IntegerField(default=0, null=True, blank=True)
# credit impact / delta of this job
credit_delta = models.IntegerField(default=0, null=True, blank=True)
tasks.py:
task_1_buy_credits(user):
# credit level of user is searched in jobs_database (the users last job)
# adds one line in the JobId database with the users new credit balance
task_2_use_credits(user,data):
# upfront unknown amount of data get processed
# credit level of user is searched in jobs_database (the users last job)
# decide to process job completely or stop if credit level is insufficient
我目前的问题是,当人们一次启动多个工作时,之前的工作尚未完成。由于我的最终贷方余额尚不清楚,我将其设置为零以防止新工作现在开始,同时可能还有余额用于完成工作。
当同时处理作业时,当信用等级增加时,会发生类似的情况。
基本上,我需要一种解决方案,它只允许以与创建任务相同的顺序运行任务,并在上一个完成之后运行。
OR
我需要进行实时"用户相关的信用等级检查"适用于尚未完成的正在运行的任务的函数。
我无法在我的Django环境中运行此同步,因为我的超时为30秒,因为这是一个托管在heroku上的Web应用程序。
答案 0 :(得分:0)
这是一个难题,因为Celery任务的设计是为了独立于其他任何事情。他们只关心您提供的信息,而不关心正在处理的工作的顺序。使用groups and chords可以通过几种方式解决这个问题,但我不知道它们如何满足您的需求。
在前面,我会向CharField
模型添加task_id JobId
。启动任务时,可以将返回的任务ID存储在该JobId
的数据库中。因此,对于给定的用户ID,您可以检查该用户的作业状态,并在仍有待处理的作业时返回最近的信用状态。