2013-04-07 35 views
1

我一直在尋找幾天找到一個事實上的方式來處理芹菜任務中的錯誤。建議如何處理Celery任務代碼中的錯誤?

在芹菜文檔中,我們確實瞭解了retying tasks because of failure

重要的是要注意,工作人員不知道崩潰,如果這樣做通常是一個不可恢復的錯誤,需要人爲干預(工人或任務代碼中的錯誤)。

...

因此,使用重試Python的錯誤,如果你的任務是冪等,如果需要的可靠性水平結合起來,與acks_late。

但是,如果我的任務由於錯誤的邏輯而存在錯誤,那麼盲目重試將無法解決問題。

在其他分佈式系統中,我使用了poison queue來存儲消息,然後在bug修復後重新處理。用於路由的芹菜文檔非常強大,使我相信可以用Celery手動完成類似的方法。

是否有推薦的方法來處理芹菜?

+0

您使用的是什麼消息代理? – 2013-04-07 23:42:28

+0

@MichaelMior我目前正在使用'BROKER_BACKEND ='django'',並將在不久的將來使用'amqp'。我承認我仍然在學習芹菜和Django,所以我可能在這裏錯了,但我覺得我的問題是更理論和運輸不可知論。也許你可以擺脫一些光線? – 2013-04-08 00:17:50

回答

3

從文檔:

重試()可用於在可恢復錯誤事件重新執行任務,例如。

I這是一個邏輯故障,那麼它不是一個可恢復的錯誤(如網絡連接問題)。通過重試可能會使事情變得更糟。

這就是說,您可以將routing_key="task.poisoned"傳遞給retry()調用,以確保所有重試的任務都放在一個特殊的隊列中(在本例中爲「task.poisoned」,但可以是任何東西)沒有工人必須去。這將有效地將這個任務放在一邊,直到你修復了這個bug,然後手動啓動一個工作者來清除那個隊列。

+0

對於我來說,由於「網絡連接問題」造成的錯誤不是不可恢復的;) – Adam 2014-05-30 15:15:27

+0

我的意思是'acks_late'在任務運行時不會「重試」其他情況下的任務。 – Adam 2014-05-30 15:27:48