簡體   English   中英

如何在 Django-Celery 失敗的情況下設置重試任務

[英]How to set retry tasks in case of failure in Django-Celery

我正在嘗試使用 celery 運行任務。 我需要在用戶按下發送按鈕時將發布請求發送到遠程服務器,所以我嘗試在設置文件中使用 celery 和 Redis 並在此配置:

BROKER_URL = os.environ.get("REDIS_URL")
CELERY_RESULT_BACKEND = os.environ.get("REDIS_URL")
CELERY_ACCEPT_CONTENT = ["application/json"]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Dubai'

根據apply_async的文檔,我可以定義重試選項,如下面的代碼:

__task_expiration = 60
__interval_start = 1 * 60

api_generator.apply_async(args=(*args),
                                group=user_key,
                                expires=__task_expiration,
                                retry=True,
                                retry_policy={
                                  "max_retries": 3,
                                  "interval_start": __interval_start
                                })

在文檔中,我找到了 apply_async 的定義:

apply_async(args=None, kwargs=None, task_id=None, producer=None, link=None, link_error=None, shadow=None, **options)

並按照文檔,我可以使用 retry 和 retry_policy 設置它

在此處輸入圖像描述

以及如何定義重試選項的示例代碼

add.apply_async((2, 2), retry=True, retry_policy={
    'max_retries': 3,
    'interval_start': 0,
    'interval_step': 0.2,
    'interval_max': 0.2,
})

我希望我的任務運行 3 次以在任何失敗的情況下運行,並且每次重試之間的間隔為 60 秒。 我的任務定義如下所示:

@shared_task
def api_generator(*args):
    import requests
    import json
    url = os.environ.get("API_URL_CALL")
    api_access_key = os.environ.get("API_ACCESS_KEY")

    headers = {
        "Authorization": api_access_key,
        "Content-Type": "application/json"
    }

    json_schema = generate_json(*args)

    response = requests.request("POST", url, headers=headers, data=json.dumps(json_schema), timeout=30)

    if response.status_code != 200:
        raise NameError("API Response error")

    return response.status_code

但是當我的代碼失敗時,我在 celery 日志中看不到任何重試機制,這是什么問題? 使用 apply_async 方法調用任務時如何定義重試? 我提出NameError("Exception")告訴工人發生了錯誤。

[編輯 1:添加acks_late ]

當您向 Celery 工作人員發送任務時,有兩件事可能導致 go 出錯:

  1. 代理和消息隊列的連接問題。
  2. 對工人提出的異常。

第一個問題可以通過定義retryretry_policy來解決。

第二種(這是您要解決的問題),可以通過在任務失敗時調用self.retry()來解決。

根據您的問題類型,設置CELERY_ACKS_LATE = True可能會有所幫助。

查看這些鏈接以獲取更多信息:

重試丟失或失敗的任務(Celery、Django 和 RabbitMQ)

https://coderbook.com/@marcus/how-to-automatically-retry-failed-tasks-with-celery/

暫無
暫無

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

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