2016-01-22 166 views
2

據我瞭解,如果我發送200 OK頭,我的AWS彈性beanstalk Worker訂閱SQS隊列應自動刪除消息。Amazon AWS Worker不會刪除SQS隊列中的消息

工作環境中的Web應用程序只應偵聽本地主機上的 。當工作環境中的Web應用程序返回 時,確認已收到200 OK響應併成功處理請求 ,守護程序將DeleteMessage調用發送到SQS隊列,以便將消息從隊列中刪除。 (SQS 會自動刪除已在隊列中的消息,比配置的RetentionPeriod長 。)如果應用程序返回任何 響應而不是200 OK,則Elastic Beanstalk將等待將 消息放回配置的VisibilityTimeout後的隊列中 期間。如果沒有響應,則Elastic Beanstalk將等待在InactivityTimeout期間之後將消息放回到隊列中,以便 該消息可用於另一次處理嘗試。

但是我沒有這樣做。他們正在處理好並將他們正在編碼的視頻保存到正確的S3存儲桶中。但他們不會像他們應該那樣刪除隊列項目。

我試圖發送頭各種方式,包括...

http_response_code(200); 

header("HTTP/1.1 200 OK"); 

header("HTTP/1.1 200 OK", true, 200); 

我的頁面上沒有輸出,但試圖調用ob_start();在開始和ob_end_flush();在發送標題之後,甚至在任何處理之前嘗試在開始時直接執行標題。沒有任何工作,消息仍然在飛行中,並在可見性超時結束後重新發送。

我不能想出其他任何東西來刪除這些消息 - 工作人員(我認爲)只接收郵件正文,所以我甚至不能把事情交給我自己的手,並通過使用API​​的處理程序刪除郵件。

幫助!

謝謝。

+0

你正在拉消息還是你有消息推送給你? – datasage

+0

你好datasage。它們被守護進程推送給工作者,我用$ postBody = file_get_contents('php:// input')接收它們; –

回答

1

OK我已經意識到這與發送或不發送響應代碼無關。

代碼正在發送,但守護程序實際上清除隊列項目沒有運行,因爲我正在使用磁盤映像作爲正常的Elastic beanstalk應用程序(之前我一直在使用它,並假定它們將是相同的 - 他們不是)

爲了解決這個問題,我創建了一個新的彈性beanstalk worker應用程序,從配置>實例中取得了標準的自定義AMI ID,並在社區實例中搜索並創建了一個新的ec2實例副本。

我對這個新的Worker風格服務器做了自定義,並製作了它的圖像,得到了這個自定義ID並替換了工作人員ID,將EC2服務器剝離並刪除了我從中獲得ID的新工作應用。

一旦我重新啓動原來的應用程序現在消息被刪除。

我希望這有助於某人在某個時刻!