LinuCレベル4 システムアーキテクト 可用性の設計 問5
可用性の設計/負荷分散と障害の局所化メッセージキューを介した非同期処理で、負荷の平準化と偶発的なエラーへの耐性を高めたい。設計として適切でないものはどれか。
当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「可用性の設計」に対応。実際の試験問題ではありません)
- AAt-least-onceの配信では同じメッセージが重複して届き得るため、コンシューマの処理を冪等になるよう設計する
- B何度処理しても失敗するメッセージは、一定回数の再試行後にデッドレターキューへ移し、後続の処理を妨げないようにする
- C一時的な障害の回復を待つ再試行は、多数のクライアントが一斉に再送しないよう指数バックオフにジッターを加える
- D取りこぼしを防ぐため、コンシューマはメッセージを受け取った直後、処理を始める前にackを返すようにする
正解:D
解説
ackは「このメッセージの処理が済んだので削除してよい」という通知です。処理を始める前にackを返すと、処理中にコンシューマが異常終了した場合にそのメッセージは再配信されずに失われるため、At-most-onceの動作になり、取りこぼしを防ぐという目的とは逆になります。取りこぼしを防ぐには処理の完了後にackを返し、その結果として起こり得る重複配信(At-least-once)には冪等な処理で対応するのが定石です。処理できないメッセージをデッドレターキューへ隔離することや、指数バックオフとジッターで再試行の集中を避けることも、部分的な障害を広げないための代表的な手法です。
選択肢ごとの解説
- A誤り(正しい記述)。At-least-onceでは再配信による重複が起こり得るため、同じメッセージを複数回処理しても結果が変わらない冪等な処理にします。
- B誤り(正しい記述)。処理できないメッセージが再試行を繰り返してキューを詰まらせないよう、デッドレターキューへ隔離して別途調査します。
- C誤り(正しい記述)。一定間隔の再試行は障害の回復直後に再送が集中しやすいため、待ち時間を指数的に延ばし、ランダムなジッターで分散させます。
- D正しい(誤っている記述)。処理前にackを返すと、処理中の異常終了でメッセージが失われます。取りこぼしを防ぐには処理完了後にackを返します。