DVAAWSのサービスを使用した開発

Amazon SQSキューからメッセージを取得して処理するワーカーアプリケーション(EC2インスタンス)があります。通常、メッセージの処理には10秒かかりますが、特定の複雑なリクエストでは最大5分かかることがあります。処理に時間がかかっている間、他のワーカーが同じメッセージを重複して取得してしまうのを防ぐための、最も効率的な設計はどれですか。

A
ChangeMessageVisibility APIを呼び出して、メッセージの可視性タイムアウトを動的に延長する。
✓ 正解
ワーカーが動的に ChangeMessageVisibility を呼び出してタイムアウトを延長することで、他のワーカーによる重複処理を防ぎつつ、通常エラー時のリトライ間隔を短く保てます。
B
SQSキューのデフォルトの可視性タイムアウトを、アプリケーションの最大処理時間である5分に一律で設定する。
一律で5分に設定すると、通常処理(10秒)のワーカーがクラッシュした場合に、他のワーカーがそのメッセージを再処理できるようになるまで無駄に5分間待たされることになります。
C
SQS FIFOキューに変更し、メッセージの重複排除ID(MessageDeduplicationId)をワーカーのインスタンスIDに設定する。
FIFOキューの重複排除IDは「送信時の重複登録」を防ぐものであり、コンシューマー側の処理時間超過による「受信の重複」を防ぐ機能ではありません。
D
メッセージのポーリングにロングポーリング(WaitTimeSeconds > 0)を使用し、重複した読み取りを防ぐ。
ロングポーリングはキューが空の際の無駄なAPI呼び出しを減らす機能であり、可視性タイムアウトとは無関係です。

解説

SQSではメッセージがコンシューマーによって受信されると、設定された「可視性タイムアウト(Visibility Timeout)」の間、他のコンシューマーから見えなくなります。処理がタイムアウト時間内に終わらない場合、メッセージが再びキューに表示され重複処理の原因となります。通常処理(10秒)と稀な長時間処理(5分)が混在する場合、キュー全体のタイムアウトを長くしすぎるとエラー時の再試行が遅れるため、ワーカー側で処理の延長が必要な場合のみ `ChangeMessageVisibility` APIを呼び出してタイムアウトを延長するのがベストプラクティスです。

ドメイン別正答率・予想スコアでリアルタイムに実力把握

無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。

無料で演習を始める →
DVA の問題一覧に戻る