2016-05-15 20 views
0

問題文の私は労働者にジョブをキューにcronを持ってSQS労働者のタイムゾーンを意識

してください。作業者は電子メールをユーザーに送信します。ジョブは異なる国のためにキューに入れられます。メールは、各国の午前11時から午後5時までに送信する必要があります。つまり、オーストラリアからのユーザーへのメールはオーストラリア時間で午前11時から午後5時までに送信する必要があります。私は

を試してみた何

ジョブのそれぞれは、それがタイムゾーンだ知っています。ジョブの読み取り時に、時間要件と一致しない場合は、キューから削除され、遅延が追加されます。遅延は、次の許容可能な時間フレームと現在の時間との差に基づいて計算される。

しかし、この解決策の問題は、遅延が通常17-18時間であることです。 AmazonのSQSには最大15分の遅延があります。 1つの回避策は毎回5分ずつジョブを遅らせることができますが、17-18時間で同じジョブが何度も選択されるため非効率です。

もう一つの非常に非効率的な解決策は、各国に複数の労働者を置くことです。

現在、オーストラリアのジョブのcron行が11 AMに設定されているため、許容できる時間にジョブをキューイングするために、同じコマンドの複数のcronエントリがあります。つまり、オーストラリアのジョブは11 AMにキューに入れられます。

私はこれを解決するための効率的なメカニズムを探しています。すべてのアイデアは大歓迎です。誰かが私を助けてくれますか?また、これらの問題の標準的な方法は何ですか?

答えて

1

キューからメッセージを削除する代わりに、visibility timeoutを変更することができます。

この操作を行うと、「飛行中」の状態のメッセージが削除されるのを待っています(実際には実行されません)。または、表示のタイムアウトに達するまで待ちます。タイムアウト時間が経過すると、メッセージは「飛行中」の状態になり、即座に再び配信の対象になります。その時点で、ワーカーは再度そのメッセージを受信し、そのメッセージを処理するかどうか、または表示のタイムアウトをリセットすることができます再び。

いくつかの制限や注意事項、ここで: - 最悪のケースは、あなたがそれを1以上を処理する必要があるだろうということでしょうから、ない重大な制限

  • 可視性のタイムアウトは、12時間の最大期間を持っていますそれが配達の資格を得るまでの時間。

  • デッドレターキューを使用している場合、配信のカウンタは、表示を変更するこれらの操作がデッドレターキューにメッセージを早期に送信しないようにする必要があります。各メッセージは、そのビジビリティタイムアウトが満了するたびに1ずつ増加します。また、マイナーな問題です。

  • 主な考慮事項:キューには、一度に120,000件のメッセージが送信されます。このアクションはメッセージを「飛行中」の状態にしておくので、処理ウィンドウが到着するのを待っている多くのメッセージを残すと思われる場合は、このソリューションは機能しなくなります。飛行中に数多くのメッセージを受信すると、メッセージの一部を受信するとフライトカウンターが最大120,000を超えるため、一部のメッセージが再度表示されるまで、長いポーリングは失敗します。ボリュームがこれよりもはるかに低い場合は、解決策は問題ありません。

私はキューの可視性のタイムアウトを変更することを示唆しているのではなく、あなたは上の処理を延期する各メッセージの可視性のタイムアウトを変更するにはSQSにリクエストを送信していないです注意してください。

+0

あなたの答えはマイケルに感謝します。また、可視性のタイムアウトとは別に問題を処理する他の方法を提案できますか? – Gargee

+0

データベースに「後で保存」メッセージを保存します。予定された納品時間はインデックス付きの列に保存され、SQSから削除されます。 SQSポーリングの各ラウンドの後に、delivery_time

+0

Michaelが示唆したことは、あなたの問題に対する最良のアプローチです。別の選択肢は、国固有の待ち行列および労働者を有することであり、労働者はその国の窓が開いているときにのみ投票する。これにより、SQSのコストが大幅に削減されます。 –

関連する問題