0

すべてをトリガし、アマゾンElastic Beanstalkで労働者のcronジョブ(SQS)は、同じメッセージを複数回

私はcronジョブのスケジューリングを提供することになっているSQS、と組み合わせる私のアマゾンElastic Beanstalkで労働者とはかなり不穏な問題を持っている - このすべてをPHPで動作します。

次のシナリオ - 最終的に何時間も実行されるバックグラウンドで定期的に実行されるPHPスクリプトが必要です。 - 定期的な仕事の部分を参照してください)

私は非常にたくさんのハウツォを読んで、実際には作成中に自動的に行われるEBSワーカーを設定しました私の展開パッケージ内にcron config(cron.yaml)を提供しました。

cronスクリプトが正しく認識されています。 sqsデーモンが起動し、メッセージがキューに入れられ、スケジュールどおりにPHPスクリプトが起動されます。スクリプトは実行され、すべて正常に動作します。

キューの構成は次のようになります。しかし(スクリプトはまだ忙しいです - とNOそれは、次のスケジュールの実行^^ではありません)処理のいくつかの時間後に SQS configuration

2番目のメッセージが開かれ、同じスクリプトの別のインスタンスが実行され、別のインスタンスが実行され、別のインスタンスが正確に5分間隔で実行されます。

私は、何らかの理由でメッセージがキューから削除されないことを確認しましたが(スクリプトがステータス200を返すようにしていますが)、スクリプトが長時間実行されると新しいメッセージの作成に終わります。

他のメッセージの発生を防ぐ方法はありますか?新しいフライトメッセージを作成しないようにキューまたはsqsデーモンに伝えますか?コード内のメッセージを削除する必要がありますか?チュートリアルでは自動的に実行するように指示していますが、

私はスクリプトを起動し、メッセージをキューから削除してスクリプトを実行させたいと思います。空想のフォールバック/リトライのメカニズムはありません:-)

インターネットで何かを見つけようと多くの時間を費やしました。失敗しました。どんな助けもありがとうございます。

おかげ

答えて

1

2番目のメッセージが開かれ、同じスクリプトの別のインスタンスが実行され、そして別の、および他の...正確に5分間隔インチ

私はそれが第2のメッセージであるとは思わない。私はそれがと同じメッセージと信じています。

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)それはデーモンをだますことはありません。もう少し試してみます。 Inactivity Timeoutを延長するか、またはキューがメッセージを再び生成しないようにする方法はありますか? – Jarek

0

設定可能な値の詳細については、the Worker Environment documentationを参照してください。 「Max retries」と同様に、いくつかの異なるタイムアウト値を設定することができます.1に設定すると再送信を防ぐことができます。ただし、デッドレターキューは実際に正常に処理されたメッセージでいっぱいになるため、これが最善の選択肢ではない可能性があります。

関連する問題