2016-12-23 41 views
0

我的大部分Celery任務的ETA時間長於Amazon SQS定義的最大可見性超時。芹菜SQS +任務重複+ SQS可見性超時

芹菜documentation說:

這會導致ETA問題/倒計時/重試在時間 執行超過了可見性超時工作;事實上,如果發生這種情況, 將再次執行,並再次執行循環。

因此,您必須增加可見性超時以匹配您計劃使用的最長ETA的時間 。

同時它也說:寫這篇文章的通過AWS支持

最大的可見性超時是 12小時(每次43200秒):

我應該怎麼如果我使用SQS,是否要避免多次執行我的工作中的任務?

回答

2

一般來說,使用非常長的ETA來完成任務並不是一個好主意。

首先,存在「visibility_timeout」問題。你可能不想要一個非常大的可見性超時,因爲如果工作人員在任務即將運行之前崩潰1分鐘,那麼在將任務發送給另一個工作人員之前,隊列仍然會等待visibility_timeout完成,我想你不想要這是另一個1個月。

芹菜文檔:

注意,芹菜會重新傳遞在工人關閉消息,所以有 長的可見性超時只會拖延的「丟失」 任務交還在斷電的情況下,或強行終止了工作人員 。

此外,SQS只允許在列表中列出很多任務。

SQS將這些任務稱爲「機上消息」。從http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

的消息被認爲是它是從 隊列收到消費者後,但尚未從隊列中刪除是在飛行。

對於標準隊列,每個隊列最多可以有120,000個機上郵件 。如果達到此限制,Amazon SQS將返回 OverLimit錯誤消息。爲避免達到限制,您應該在隊列處理後從隊列中刪除消息。您還可以通過 增加用於處理消息的隊列數。

對於FIFO隊列,每個隊列最多可以有20,000個機上消息 。如果達到此限制,Amazon SQS不會返回錯誤 消息。

我看到兩種可能的解決方案,您可以使用RabbitMQ的來代替,該犯規依靠可視性超時(有「的RabbitMQ即服務」,如果你不想自己管理服務)或更改您的代碼有非常小的ETAs(最佳做法)

這些是我的2美分,也許@asksol可以提供一些額外的見解。

+0

我以前的設置是可見性超時= 5分鐘。在創建任務之後,它被添加到排隊等待執行(可以在6小時內與ETA說)。接下來發生的事讓我驚訝。在日誌中,我看到每五分鐘就會在服務器上添加新任務。我懷疑所有收集到的任務將在6個小時內逐個執行。這就是爲什麼我決定增加可見性超時的原因。是的,如果工人會崩潰,重新傳送的任務將遲到,但至少在工作日誌中將有1個任務,而不是1000個。如果我沒有正確思考,請糾正我。 –

+1

由於這是可見性超時,預計每5分鐘就會看到一項新任務。這意味着,如果員工在5分鐘內沒有開始執行此任務,則SQS認爲員工錯過了該任務,因此SQS將重新計劃將其發送給其他員工。增加可見度超時是解決這個問題的方法,儘管它也有自己的權衡。 – giorgosp

+0

這裏我有兩個問題。首先,使用SQS我沒有任何其他方法來控制隊列,除了日誌。所以我假定隊列日誌中列出的所有任務都將被執行。這是真的嗎?或者芹菜會在執行前檢查任務的ID?第二個:現在我在一臺服務器上只有一個隊列。如果SQS經紀人將相同的任務發送給不同服務器上的工作人員,會發生什麼情況?你怎麼看,它會被執行兩次? –