1. 強い一貫性 — 全員が同じ「今」を見る
最も強い約束が線形化可能性(linearizability)です。各操作が「どこかの一瞬」に起きたように見え、書込が完了した後に始まった読み取りは、誰がどのレプリカから読んでも必ず新しい値を返します。利用者にとっては「サーバが1台しかない」のと区別がつきません。
下のデモは実現方法の一例として「全レプリカへ複製し終えてから書込完了を返す」同期複製を示しています(実際にはクォーラムや合意プロトコルで実現することが多く、それは第7回・第9回で扱います)。
線形化可能性 — 書込完了後は、どこを読んでも新値
書き手の「書込完了」は全レプリカに新値が行き渡ってから返ります。だから、その後に読む2人の読者は、どのレプリカに当たっても必ず x=2。「読む相手を変える」で読者の宛先を替えても結果が変わらないことを確認してください。
POINT — 線形化可能性 =「1台のマシンに見える」
それぞれの操作が、開始と完了の間のどこか一瞬で起きたとみなせる並べ方が存在する — これが線形化可能性の定義。実時間で「書込完了 → その後に読み取り開始」という関係があれば、読み取りは必ず新値を返す。そのかわり、レプリカ間の調整(複製待ち・合意)のぶん書込は遅くなり、ネットワーク分断時には応答を止めざるを得ない場面が出てくる。
t完了(W) < t開始(R) ⇒ R は W の書いた値(またはそれより新しい値)を返す
実時間で重ならない操作は、その順のとおりに見えなければならない — これが破れたら線形化可能ではない
2. 結果整合性 — いつかは揃う、途中はバラバラ
逆にいちばんゆるい約束が結果整合性(eventual consistency)です。書込はリーダーが受け取った時点ですぐ完了を返し、他のレプリカへはあとから非同期で伝わります。だから伝播が終わるまでの間は、どのレプリカを読むかで違う値が返ります。
結果整合性 — 読む場所で答えが違う時間帯がある
読者X・Yはそれぞれ別のレプリカを順に読んでいます。数字の列は読めた値の履歴。伝播が終わるまでは 1 と 2 が混ざり、同じ瞬間でも人によって答えが違います。速さを下げるほど「バラバラな時間帯」が長くなりますが、最後は必ず収束します。
更新が止まる ⇒ やがて すべてのレプリカで x1 = x2 = … = xN
保証されるのは「いつかは同じ値になる」ことだけ。「いつまでに」は約束されない
注意 — 「いつか」には期限がない
結果整合性は「壊れてもよい」という意味ではなく、収束までの時間に保証がないという意味。レプリカ遅延は普段は数ミリ秒でも、障害や混雑時には分単位に伸びることがある。「書いた直後に読んだら見えなかった」はバグではなく仕様どおりに起きる — だから次のセッション保証をアプリ側で設計に組み込む必要がある。
3. セッション保証 — 「自分から見た世界」だけは守る
全体を強くしなくても、1人のユーザから見た世界の筋だけ通す中間の約束があります。代表が「自分の書き込みを読む(read-your-writes)」と「単調読み取り(monotonic reads)」。これが無いと、SNSで投稿した直後に自分の投稿が見えなかったり、リロードしたら画面が過去に巻き戻ったりします。
セッション保証がないと起きる事故 — 2つのシナリオ
保証 OFF では、読み取りが遅れたレプリカに当たって「投稿が消えた!?」「コメントが減った!?」という事故が起きます。保証を ON にすると、読み先をリーダーや「前回以上に新しいレプリカ」に固定するので事故が消えます。両シナリオ × ON/OFF を切り替えて見比べてください。
4. 一貫性スペクトラム — 強さと速さのトレードオフ
一貫性モデルは「強い ⇔ 弱い」の軸の上に並べられます。強くするほど、レプリカ間の調整のための通信が増えて応答は遅くなり、ネットワーク分断や障害のときに応答を返せない場面が増えます。どこを選ぶかはアプリの性質次第 — 残高は強く、タイムラインはゆるく、が定石です。
一貫性モデルの地図 — 強さ・速さ・可用性
ボタンでモデルを選ぶと、軸上の位置と「応答の速さ」「分断・障害時の可用性」のバーが切り替わります。強いモデルほど両方のバーが短くなる — この交換関係が CAP 定理(第8回)につながります。
一歩先へ — 可用性と両立できる強さの上限
分断が起きても応答し続けるシステムで実現できる一貫性には理論的な上限があり、因果一貫性(+収束)がそのほぼ限界であることが知られている。一方、CRDT は「どんな順番で更新を混ぜても同じ状態に収束する」よう設計されたデータ構造で、結果整合性の世界を大幅に安全にする道具。逆方向の極として、Google Spanner は原子時計(TrueTime)を使い、地球規模で線形化可能性(外部一貫性)を提供している。
5. まとめ
- 線形化可能性:書込完了後の読み取りは必ず新値。「1台に見える」が、遅く・分断に弱い。
- 結果整合性:書込は即完了、伝播はあとから。読む場所で値が違う時間帯があるが、いつかは収束。「いつまでに」は無保証。
- セッション保証:「自分の書き込みを読む」「単調読み取り」など、1ユーザ視点の筋だけ守る現実的な中間解。
- 強さ ⇔ 速さ・可用性のトレードオフから逃げられない。データごとに必要な強さを選ぶのが設計。