LinuCレベル4 システムアーキテクト 性能・拡張性の設計 問9
性能・拡張性の設計/性能の拡張ある人気商品の在庫数をデータベースの1行で管理しており、すべての注文処理がその行を更新するため、行ロックの待ちが発生してスループットが頭打ちになっている。ロックによるボトルネックを緩和する設計として最も適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「性能・拡張性の設計」に対応。実際の試験問題ではありません)
- AデータベースサーバーのCPUコア数とメモリを増強し、1件あたりの更新処理を速くして待ち時間を短くする
- Bリードレプリカを追加し、在庫数の参照と更新の処理を複数のレプリカに分散させて待ちを減らす
- Cトランザクション分離レベルをSERIALIZABLEに上げ、在庫数の更新を厳密に直列化して整合性を保つ
- D在庫数を複数の行に分けて持ち、注文ごとに異なる行を減算させて、同じ行へのロックの集中を分散する
正解:D
解説
1つの行を全処理が更新すると、その行のロックを1件ずつ順番に取ることになり、サーバーの台数や性能を上げても処理は直列化されたままです。在庫数を複数の行(バケット)に分けて持ち、注文ごとに異なる行を減算させれば、ロックが分散されて並行して更新できるようになり、残数は全行の合計で求めます。あわせて、トランザクション内で外部サービスの呼び出しなど時間のかかる処理を行わず、ロックを保持する期間を短くすることも有効です。分離レベルを上げると競合による待ちや再実行が増え、ボトルネックはかえって悪化します。
選択肢ごとの解説
- A誤り。1件の処理は速くなりますが、同じ行のロックを順番に取る構造は変わらないため、並行性は上がらず効果は限られます。
- B誤り。レプリカは読み取りの分散には使えますが、更新はすべてプライマリで行うため、行ロックの競合は解消しません。
- C誤り。分離レベルを上げると競合の検出や待ちが増え、スループットはかえって低下します。
- D正しい。ロックの対象を複数の行に分散することで、注文処理が同じ行を奪い合わずに並行して更新できるようになります。