結果整合性

分散システムで更新が全ノードに即座に反映されず、最終的に一貫した状態に収束するモデル

分散システムデータベース

結果整合性とは

結果整合性 (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 つが代表的なパターンだ。

実務での活用方法は関連書籍にも詳しい。

関連用語