過去問ドリル

LinuCレベル4 システムアーキテクト 可用性の設計 問5

可用性の設計/負荷分散と障害の局所化

メッセージキューを介した非同期処理で、負荷の平準化と偶発的なエラーへの耐性を高めたい。設計として適切でないものはどれか。

当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「可用性の設計」に対応。実際の試験問題ではありません)

正解:D

解説

ackは「このメッセージの処理が済んだので削除してよい」という通知です。処理を始める前にackを返すと、処理中にコンシューマが異常終了した場合にそのメッセージは再配信されずに失われるため、At-most-onceの動作になり、取りこぼしを防ぐという目的とは逆になります。取りこぼしを防ぐには処理の完了後にackを返し、その結果として起こり得る重複配信(At-least-once)には冪等な処理で対応するのが定石です。処理できないメッセージをデッドレターキューへ隔離することや、指数バックオフとジッターで再試行の集中を避けることも、部分的な障害を広げないための代表的な手法です。

選択肢ごとの解説

  • A誤り(正しい記述)。At-least-onceでは再配信による重複が起こり得るため、同じメッセージを複数回処理しても結果が変わらない冪等な処理にします。
  • B誤り(正しい記述)。処理できないメッセージが再試行を繰り返してキューを詰まらせないよう、デッドレターキューへ隔離して別途調査します。
  • C誤り(正しい記述)。一定間隔の再試行は障害の回復直後に再送が集中しやすいため、待ち時間を指数的に延ばし、ランダムなジッターで分散させます。
  • D正しい(誤っている記述)。処理前にackを返すと、処理中の異常終了でメッセージが失われます。取りこぼしを防ぐには処理完了後にackを返します。
LinuCレベル4 システムアーキテクトの問題を演習モードで解く