無限ノック › DVA 練習問題一覧 › 問題
DVAAWSのサービスを使用した開発

Amazon SQSキューからメッセージを取得して処理するワーカーアプリケーションがあります。通常、メッセージの処理には数秒で完了しますが、ごく稀に発生する複雑なリクエストでは最大5分かかることがあります。処理が長引いている間に、他のワーカーインスタンスが同じメッセージを重複して取得・処理してしまうのを防ぐための、最も適切なアプローチはどれですか。

A
処理に時間がかかることを検知した時点で、ワーカーから ChangeMessageVisibility APIを呼び出して当該メッセージの可視性タイムアウトを動的に延長する。
✓ 正解
ワーカーアプリケーションから動的に ChangeMessageVisibility を呼び出してタイムアウトを延長することで、通常処理時の迅速な再試行を維持しつつ、長時間の処理における重複取得を確実に防げます。
B
SQSキューのデフォルトの可視性タイムアウトを、アプリケーションの最大処理時間である5分に一律で長めに設定する。
一律で5分に設定すると、通常の短い処理でワーカーがクラッシュした場合に、他のワーカーがそのメッセージを再処理できるようになるまで無駄に5分間待たされることになり効率が下がります。
C
SQS FIFOキューに変更し、メッセージの重複排除ID(MessageDeduplicationId)をワーカーのインスタンスIDに設定する。
FIFOキューの重複排除IDは「送信時の重複登録」を防ぐためのものであり、コンシューマー側の処理時間超過によって可視性タイムアウトが切れた場合の「受信の重複」を防ぐ機能ではありません。
D
メッセージのポーリングにロングポーリング(WaitTimeSeconds > 0)を使用し、他のワーカーによる重複した読み取りを自動的にブロックする。
ロングポーリングはキューが空の際の無駄なAPI呼び出し(ショートポーリング)を減らすための機能であり、可視性タイムアウトとは直接関係ありません。

解説

Amazon SQSでは、メッセージがコンシューマーによって受信されると、設定された「可視性タイムアウト(Visibility Timeout)」の間、他のコンシューマーから見えなくなります。通常の処理は数秒で終わるものの稀に5分かかるような環境では、キュー全体のタイムアウトを5分に固定すると、通常のエラー時にメッセージが再キューイングされるまでの待ち時間が無駄に長くなります。そのため、必要に応じてワーカー側から `ChangeMessageVisibility` APIを呼び出し、処理が継続している間だけタイムアウトを動的に延長するのがベストプラクティスです。

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

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

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