結果整合性
分散システムで更新が全ノードに即座に反映されず、最終的に一貫した状態に収束するモデル
分散システムデータベース
結果整合性とは
結果整合性 (Eventual Consistency) は、分散システムで更新が全ノードに即座に反映されず、一定時間後に最終的に一貫した状態に収束するモデルである。DynamoDB のデフォルトの読み取りモデル。
強い整合性 vs 結果整合性
強い整合性:
書き込み → 全ノードに反映 → 読み取り (最新値を保証)
遅い、可用性が低い
結果整合性:
書き込み → 一部のノードに反映 → 読み取り (古い値の可能性)
→ 数ミリ秒〜数秒後に全ノードに反映
速い、可用性が高い
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
// 書き込み直後の読み取りは強い整合性を使う
await db.put({ TableName: 'users', Item: updatedUser });
// 直後の読み取り: ConsistentRead = true
const user = await db.get({
TableName: 'users',
Key: { id: updatedUser.id },
ConsistentRead: true,
});
AWS サービスの整合性モデル
| サービス | デフォルト |
|---|---|
| DynamoDB | 結果整合性 (強い整合性もオプション) |
| S3 | 強い整合性 (2020 年以降) |
| ElastiCache | 結果整合性 (非同期レプリケーション) |
| Aurora リードレプリカ | 結果整合性 (レプリケーション遅延) |
結果整合性を受け入れる設計
書き込み成功を即座に UI に反映する楽観的 UI、一定間隔で最新データを取得するポーリング、DynamoDB Streams で変更を通知するイベント駆動の 3 つが代表的なパターンだ。
実務での活用方法は関連書籍にも詳しい。