【きゃっぷていり】

CAP定理 とは?

最終更新:
💡 通信が分断されたとき、整合した値と全要求への応答は両立できない

ネットワーク分断が起こり得る分散データシステムで、強い一貫性と、正常なノードへのすべての要求に応答する可用性を同時には保証できないという定理。分断時の動作を考える手掛かりになる。

📌 このページのポイント
CAP定理:分断時の保証を考える サーバーA 値を 0 → 1 に更新 更新完了 サーバーB 値は 0 のまま その後に読み取り 通信分断 Bが更新を確認できないとき 古い値 0 を返す 応答はできても 強い一貫性を失う 確認できるまで待つ 分断が続くと 応答を保証できない 分断し得る条件で、CとAの両方は保証できない
単一の値の読み書きの例。下の二つはBの動作の比較で、連続する手順ではありません。通常時も常にどちらかを捨てる、という意味ではありません。
ひよこ ひよこ
CAPは「3つから2つ選ぶ」でいい?
ペンギン先生 ペンギン先生
それだけだと誤解しやすいよ。通信が分断され得る条件で、強い一貫性Cと、すべての要求に応答する可用性Aを同時に保証できない、という話なんだ。いつでも好きな二つを選べる商品メニューではないよ。
ひよこ ひよこ
分断すると何が困るの?
ペンギン先生 ペンギン先生
サーバーAで値を0から1へ更新して完了したあと、別のサーバーBへ読み取り要求が来たとするね。AとBが通信できず更新を知らないBは、正しい最新の値を確かめられないんだ。
ひよこ ひよこ
古い0を返せば応答はできるね。
ペンギン先生 ペンギン先生
うん。でも完了した更新より前の値を返すので、この例では強い一貫性を守れない。逆に値を確かめるまで待つと、分断が続く限り応答できない。エラーだけを返しても、要求された読み取りを完了したことにはならないよ。
ひよこ ひよこ
Cはデータのルールを守ること?
ペンギン先生 ペンギン先生
CAPでは、操作が一つのデータに順番に行われたように見え、実時間の前後関係にも従う強い一貫性を考えるよ。ACIDのCでいう整合性制約とは同じ定義ではないんだ。
ひよこ ひよこ
使うDBをCP型かAP型で決めればいい?
ペンギン先生 ペンギン先生
分類だけでは足りないよ。同じシステムでも、操作や設定、対象データによって判断が変わる。たとえば在庫の過剰販売を許すか、予約を一時停止するかは業務要件次第。製品名だけで自動的には決まらないんだ。
ひよこ ひよこ
分断がないときも、どちらかを諦めるの?
ペンギン先生 ペンギン先生
CAPだけを理由に、通常時も片方を捨てる必要はないよ。ただし、応答の遅さや障害からの復旧も設計に関わる。どの操作を止め、どの値を返し、通信が戻ったらどう整えるかまで考えよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「CAP定理」って出てきたら「分断時に強い一貫性と全要求への応答を両方は保証できない」と思えばだいたいOK!
📖 おまけ:英語の意味
「CAP Theorem (Brewer's Theorem)」 = 一貫性・可用性・分断耐性の頭文字
💬 Consistency、Availability、Partition toleranceの頭文字だよ。Eric Brewerが2000年の講演で提示した予想を、Seth GilbertとNancy Lynchが形式化・証明したことでも知られているよ。

参考資料

← 用語集にもどる