コンシステンシモデル
一貫性は、読者がどのような価値観を見ているか、そして競争力のある変化の間にどのような順序で見られるか。モデルの正しい選択は、不変量、レイテンシー、可用性、コスト(PACELC)の厳密さのバランスです。以下は、モデルとそのアプリケーションの実用的なガイドです。
1)「厳密な」モデル
Linearizable(強い)
すべての操作がリアルタイムを尊重するいくつかの均一な順序で即座に実行されたかのような挙動。
長所:シンプルな精神モデル、お金と独自性のための安全。
短所:quorums/leader→p95/p99成長、特に地域間成長。
ユースケース:残高、ハードリミットの在庫、固有の名前/キー。
シーケンシャル整合性
すべてのスレッドには同じ順序の操作が表示されますが、リアルタイムの順序は必要ありません。線形化可能よりもわずかに弱く、製品に直接展示されることはめったにありません。
シリアライズ可能
トランザクションのいくつかの順番に相当します(個々の操作ではありません)。
長所:クエリ/テーブルレベルでの複雑な不変量の正しさ。
短所:より高価です(ブロック/バージョン管理/競合検証)。
ユースケース:複雑な金融取引、一貫した再集計、在庫。
スナップショット分離(SI)
各トランザクションは時間の経過とともに不変スナップショットを読み込みます。エントリは「同じ行」で競合しますが、書き込みスキューは可能です。
長所:ロックなしで高速読み取り、安定したレポート。
短所:シリアライズできない、スキュー・トラップを書く(例:勤務中の医師)。
ユースケース:分析、レポート、ハードインバリアントのないほとんどのCRUD。
2)セッションごとの因果保証
Read-Your-Writs (RYW)
クライアントは常に彼のエントリの後に後続の読み取りでそれを見ます。
長所:良いUX(フォーム→確認)。
短所:ローカル保証、グローバルではありません。
単調な読み取り/書き込み
読み取りは「ロールバック」しません。1つのクライアントのレコードは、送信されたレコードと同じ順序で適用されます。
因果の一貫性
操作が別の(A→B)に依存する場合、誰もがBの前にAを見ます。
長所:ソーシャルフィード、コメントのための直感的な。
短所:ルーティングと因果性ラベル(ベクトルクロック)はより困難です。
ユーザーキー:コミュニケーション、共同編集、イベントフィード。
3)弱いモデルとハイブリッドモデル
境界のあるStaleness
読み取りはΔ tまたはN以上のバージョンを遅延させることはできません。
長所:予測可能なUX、地域的に良好な妥協。
短所:書き込みの競合から保護しません。
最終的な一貫性
時間が経つにつれて、すべてのコピーが収束します。順序および遅れは保証されません。
長所: 最小限のレイテンシ/コスト、高可用性(AP)
短所:明示的なマージ(CRDT/ドメインルール)が必要です。
ユースケース:キャッシュ、フィード、メトリクス、いいね、ネンクリティカルディレクトリ。
4)典型的な異常とその意味
Dirty Read:コミットされていないデータを読む。
Read:トランザクション内で同じ読み取りが異なる値を与えます。
Phantom:リクエストを繰り返すと、述語に一致する文字列が表示/消えます。
Write Skew (SI付き):2つのトランザクションが交差不変を読み取り、異なる行を書き「、合計は≥ 1でなければならない」という条件に違反します。
ロストアップデート:レコードは、競合他社の変更を「上書き」します。
5)クォーラムと読み書きレベル
多くのストアでは、'R'/'W'レベル(読み書きするレプリカの数)を設定できます。
Quorum (R+W> N)は、最後のレコードの読み取りの「交差」と強力な保証を与えます。
W=1、 R=1→低遅延ですが、古いデータは可能です。
チューニング:重要な操作-高い'W'(またはリーダー)、残りは速度のための低い'R'。
読み取り修復/ヒント付きハンドオフヘルプは、バックグラウンドで一貫性を取得します。
6)時間と順序: 私たちはどのように「理解」因果関係
ランポート時計:イベントの部分的な順序。
ベクトルクロック:因果関係を修正し、競合を検出できます。
Hybrid/TrueTimeアプローチ:トランザクションのオーダーとバインドステルス性のためにクラスタ内のクロックの広がりを制限します。
バージョン管理:'version/ts+actor' for merge;CRDTでは、閉じた半群(commutativity/idempotency)。
7) CRDTとドメインのマージ
CRDT(収束/複製されたデータ型)は、G-Counter、 OR-Set、 LWW-Register、 Map、 text OT/WOOTバリアントを調整せずに収束を保証します。
便利な場合:いいね、多くのタグ、バスケット、ドキュメント。
制限事項:特定のドメインエンティティの正しい「マージ」セマンティクスを考え出します。
8) CAP/PACELCとのコミュニケーション
マルチリージョンでの厳密なモデル(線形/シリアライズ可能)→レイテンシーが増加するCP (PACELC: Cを選択してLを支払う)。
弱い/ハイブリッドモデル→APおよび/または低Lですが、マージ/競合解像度が必要です。
ハイブリッド:不変量のCP-kernel+AP-projections/readsのキャッシュ。
9)モデル選択: チェックリスト
1.不変量:何を違反すべきではありませんか?(独自性、バランス、限界)。
2.地域性:書き込み/読み取りはどこで行われますか?(ローカル/グローバル)。
3.遅延によるSLO:重要な経路のためのp95/p99?
4.調整価格:地域間のクォーラムで支払う準備はできていますか?
5.競合:決定論的なマージがあるか、コーディネーターが必要ですか?
6.UXの期待:RYW/monotonic/causalはクライアントにとって重要ですか?
7.観測性:遅延/紛争/陳腐化の程度をどのように測定しますか?
8.フォールバック:ネットが分割(P)されるとどうなりますか?読み取り専用/ローカルエントリ/キュー?
10)クイックレシピ
支払/バランス:Linearizable/Serializable、リーダー+クォーラム、短いタイムアウト;RYWの測定値。
プロファイル/フィード:因果/限界staleness+キャッシュ;いいね/カウントのためのCRDT;著者のためのRYW。
Search/Analytics: SI/Read Committed、非同期投影、最終的なインデックス。
グローバルSaaS:ジオパーティショニング;「ホームレコード」-CP、レポート/ディレクトリ-AP。
共同編集:因果/最終的な+CRDT/OT;「歴史」を保存しています。
11)一貫性の観察
遅延メトリクス:'replication_lag'、 'staleness_age_ms' (p50/p95/p99)。
競合:競合の割合、平均解決時間。
クォーラム:'R/W'クォーラムの成功、地域間パスのタイムアウト。
顧客保証:RYW/monotonic-セッションごとに追跡タグ。
12)典型的なエラー
ビジネス基盤のない強力な「どこでも」を要求する→レイテンシーとコストの爆発。
サガ/CRDT→ファントムと不変量の喪失のない異なる領域への二重書き込み。
UXでRYW/monotonicityを無視→送信されたデータを「欠落」します。
キャッシュ/予測の老化を追跡しないでください→「永遠」矛盾。
想定外のマージ→予期しない損失/重複した値。
13)ミニリファレンスアーキテクチャ
書き込みコア(CP):リーダー、クォーラムレコード、SLOとタイムアウト、ログ。
読み取り平面(AP):実体化ビュー、TTLキャッシュ、読み取り修復。
クライアント:sticky-session/session保証(RYW/monotonic)、バージョンラベル。
エンジンの競合:CRDT/ドメインルール、手動決済キュー。
モニタリング:ラグ、競合、古い読み取りのシェア。
結論
一貫性モデルは、データ、レイテンシー、および可用性の間のエンジニアリング契約です。不変量とSLOから始め、必要な場所を厳密に選択し、顧客保証、クォーラム、時間、観測可能性を忘れずに、できる場所を弱くします。モデルの有能な組み合わせは、ビジネスの真実とユーザーの信頼を犠牲にすることなく、規模、予測可能性、持続可能性を提供します。