結果整合性
分散システムで更新が全ノードに即座に反映されず、最終的に一貫した状態に収束するモデル
結果整合性とは
結果整合性 (Eventual Consistency) は、分散システムで更新が全ノードに即座に反映されず、一定時間後に最終的に一貫した状態に収束するモデルである。DynamoDB のデフォルトの読み取りモデル。
強い整合性 vs 結果整合性
強い整合性と 結果整合性 の違いを図で示す。
強い整合性:
書き込み → 全ノードに反映 → 読み取り (最新値を保証)
遅い、可用性が低い
結果整合性:
書き込み → 一部のノードに反映 → 読み取り (古い値の可能性)
→ 数ミリ秒〜数秒後に全ノードに反映
速い、可用性が高い
DynamoDB の整合性
DynamoDB の整合性のコード例を示す。
// 結果整合性 (デフォルト、高速、低コスト)
const item = await db.get({
TableName: 'users',
Key: { id: '123' },
});
// 強い整合性 (やや遅い、コスト 2 倍)
const item = await db.get({
TableName: 'users',
Key: { id: '123' },
ConsistentRead: true,
});
| 観点 | 結果整合性 | 強い整合性 |
|---|---|---|
| レイテンシ | 低い | やや高い |
| コスト | 0.5 RCU | 1 RCU |
| 可用性 | 高い | やや低い |
| データの鮮度 | 数ミリ秒遅れる可能性 | 最新値を保証 |
結果整合性が問題になるケース
結果整合性が問題になるケースを図で示す。
1. ユーザーがプロフィールを更新
2. 直後にプロフィールページを表示
3. 結果整合性 → 古いプロフィールが表示される
→ 「更新したのに反映されない」とユーザーが混乱
対策: Read Your Own Writes
Read Your Own Writes のコード例を示す。
// 書き込み直後の読み取りは強い整合性を使う
await db.put({ TableName: 'users', Item: updatedUser });
// 直後の読み取り: ConsistentRead = true
const user = await db.get({
TableName: 'users',
Key: { id: updatedUser.id },
ConsistentRead: true,
});
AWS サービスの整合性モデル
AWS サービスの整合性モデルを以下にまとめる。
| サービス | デフォルト |
|---|---|
| DynamoDB | 結果整合性 (強い整合性もオプション) |
| S3 | 強い整合性 (2020 年以降) |
| ElastiCache | 結果整合性 (非同期レプリケーション) |
| Aurora リードレプリカ | 結果整合性 (レプリケーション遅延) |
結果整合性を受け入れる設計
書き込み成功を即座に UI に反映する楽観的 UI、一定間隔で最新データを取得するポーリング、DynamoDB Streams で変更を通知するイベント駆動の 3 つが代表的なパターンだ。
実務での活用方法は関連書籍にも詳しい。
この記事は役に立ちましたか?
関連用語
CAP 定理
分散システムで一貫性、可用性、分断耐性の 3 つを同時に満たすことはできないという定理
合意アルゴリズム
分散システムで複数のノードが同じ値に合意するためのアルゴリズム
DynamoDB
AWS のフルマネージド NoSQL データベースで、ミリ秒単位のレイテンシとシームレスなスケーリングを提供する
ACID
データベーストランザクションの 4 つの特性 - 原子性、一貫性、分離性、永続性
NoSQL
リレーショナルモデル以外のデータベースの総称で、スケーラビリティと柔軟性を重視する
CQRS
データの読み取り (Query) と書き込み (Command) を別々のモデルで処理し、それぞれを独立して最適化するアーキテクチャパターン
関連する記事
データベース本ガイド - SQL から設計まで学べる技術書の選び方
データベースの基礎から設計、パフォーマンスチューニングまで学べる技術書の選び方と学習順序を紹介します。
README を書くように本を読む - エンジニアのための構造化読書法
エンジニアが日常的に書く README のフォーマットを読書に応用する方法を紹介します。目的・使い方・注意点の 3 点で本の内容を整理すると、知識の再利用性が飛躍的に高まります。
バグを生むのは知識不足ではなく想像力不足である
バグの多くは、コードを書いた時点で「こういうケースもありうる」と想像できなかったことが原因です。想像力を鍛える読書法と、エッジケースへの感度を高める方法を解説します。