簡體   English   中英

芹菜任務隊列

[英]task queue in celery

我有一個處理數據的服務。 它是用Python(Django)編寫的,並使用Celery使其異步。

處理我們的數據需要使用信用。 您也可以購買積分,這是由Stripe-webhook觸發的。

涉及信用更改的每個操作都被列為“工作”。 我有2個Celery任務,所有任務都將作業添加到某個JobId數據庫。

我使用“作業”概念來跟蹤在哪個作業中處理哪些數據。

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)

task.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

我當前的問題是,當人們一次開始多個工作時,上一個工作還沒有完成。 由於尚不知道我的最終貸方余額,因此我將其設置為零,以防止現在開始新工作,而可能還有剩余的貸項來完成該工作。

當在同一時間處理作業時增加信用額度時,也會發生類似情況。

基本上,我需要一種解決方案,該解決方案只允許按照創建任務的順序運行任務,並且在完成前一個任務之后運行。

要么

我需要一個實時的“與用戶相關的信用級別檢查”功能,該功能可用於尚未完成的正在運行的任務。

由於我的超時時間為30秒,因此我無法在Django環境中運行此同步,原因是這是在heroku上托管的Web應用程序。

這是一個棘手的問題,因為Celery任務是預先設計為獨立於其他所有任務的。 他們只是關心您提供給他們的信息,而不關心正在處理的作業的順序。 通過使用組和和弦 ,有幾種方法可以解決此問題,但是我不知道它們如何滿足您的需求。

在前面,我將task_id CharField添加到JobId模型。 啟動任務時,可以將返回的任務ID存儲在該JobId的db中。 因此,對於給定的用戶ID,您可以檢查該用戶的作業狀態,如果仍有待處理的作業,則返回最近的信用狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM