2017-02-15 49 views
0

所有,亞馬遜彈性魔豆工人的cronjob(SQS)觸發相同的消息多次

我有我的亞馬遜彈性魔豆工人一個相當令人不安的問題SQS結合起來,這是爲了提供一個cron作業調度 - 這一切使用PHP運行。

以下情形 - 我需要一個PHP腳本在後臺,它最終可能運行幾個小時定期執行。我看到這個漂亮介紹這似乎是恰當覆蓋我的方案(AWS Worker Environments - 見週期任務的部分)

所以我讀了很多的HOWTO,並設立EBS工人與SQS(實際上是創建過程中自動完成工人的),並提供了我的部署包內的cron配置(cron.yaml)。

這個cron腳本正確識別。 sqs守護進程啓動,消息被放入隊列並按計劃精確觸發我的PHP腳本。腳本運行,一切正常。

隊列的配置是這樣的: SQS configuration

但處理一段時間後(劇本仍然忙 - 和NO是不是下一個計劃運行^^)打開第二個消息,同一腳本的另一個實例將以5分鐘的間隔執行,另一個實例和另一個實例將被執行。

我懷疑,不知何故該消息不會從隊列中刪除(雖然我保證腳本發送狀態200回),它在創造新的消息結束了,如果腳本運行時間過長。

有沒有辦法阻止另一消息的產卵?告訴隊列或sqs守護進程不要創建新的隊列消息?我必須刪除我的代碼中的消息嗎?雖然教程美國應該自動發生

我想只觸發腳本,從隊列中刪除消息,並讓腳本運行。沒有華麗的回退/重試機制,請:-)

我花了很多時間試圖找到在互聯網上的東西。不成功。任何幫助表示讚賞。

由於

回答

1

的第二消息被打開並執行相同的腳本的另一個實例,以及另一個,和另一...在精確至5分鐘的間隔。

我懷疑是一個第二消息。我相信這是相同的消息

如果您在Inactivity Timeout失效之前沒有響應200 OK,則消息返回隊列,並且是的,您會再次收到它,因爲系統假定您已經崩潰,並且您希望再次看到它。這是設計的一部分。

有您收到一個X-Aws-Sqsd-Receive-Count請求頭,告訴你大約多少次在當前消息已送達。所述X-Aws-Sqsd-Msgid請求報頭標識的唯一消息。

如果你不能確保腳本會超時之前完成,那麼這是不可能的適當使用情況下使用該服務。這聽起來像服務工作正常。

+0

嘿邁克爾,謝謝你的迴應。你是對的。這是一樣的信息。我發送200這裏描述[鏈接](http://stackoverflow.com/questions/15273570/continue-processing-php-after-sending-http-response),但它並沒有騙過守護進程。我會再試驗一下。如果我發送200的速度不夠快 - 有沒有辦法延長Inactivity Timeout或防止隊列再次產生消息? – Jarek

0

查看the Worker Environment documentation瞭解有關可配置值的詳細信息。您可以配置多個不同的超時值以及「最大重試次數」,如果設置爲1,則會阻止重新發送。但是,死信隊列將填滿實際處理成功的消息,因此這可能不是您的最佳選擇。