書籍メモ「Persistence Best Practices for Java Applications」Chapter 10

https://learning.oreilly.com/library/view/persistence-best-practices/9781837631278/

Part 3: Architectural Perspective over Persistence

Chapter 10 Architecting Distributed Systems – Challenges and Anti-Patterns

・Data integration scales and distributed transactions
・The dual-write anti-pattern
・Microservices and shared databases
・Eventual consistency problems

分散システムの構築は、ワークロードを複数のノードに分散させながら、高可用性、耐障害性、より優れたパフォーマンスとスケーラビリティを実現することを目的としている。
分散システムのアーキテクチャーにおける重要な課題の1つは、適切なデータの一貫性を実現することです。
もう1つの課題は、ネットワークの遅延と通信オーバーヘッドの管理にある。

一般的に集中型データベースで保証される従来の原子性、一貫性、分離、および耐久性(ACID)特性は、ネットワーク遅延、ノード障害、および並行性の問題により、分散ノード全体で強制することが難しくなります。
課題に対処するための1つのアプローチは、2相コミット(2PC)や3相コミット(3PC)のような分散トランザクションプロトコルを使用することである。
もう1つのアプローチは、偶発的一貫性や楽観的並行性制御など、より緩やかな一貫性モデルを採用することである。
一貫性保証をトレードオフにして、スケーラビリティと可用性を高める。

分散システムにおいてスケールの大きなデータ統合を行うには、分散トランザクションの課題に対処し、複数のノード間で一貫性を維持する必要がある。
アーキテクトや開発者は、分散トランザクションシステムを設計する際に、一貫性の保証、スケーラビリティ、パフォーマンス間のトレードオフを考慮する必要があります。

二重書き込み(デュアルライト(Dual-Write))のアンチパターン
デュアルライトが問題になる理由
・複雑さとカップリング
・パフォーマンスのオーバーヘッド
・矛盾と失敗
・データ完全性の課題
・スケーラビリティの限界
データを統合・同期するための他の選択肢
・ETL
・イベント駆動型アーキテクチャ
・メッセージキュー
残念ながら、デュアルライトは分散アーキテクトとして直面する最も一般的なアンチパターンであり、間違いである。

マイクロサービスと共有データベース
多くの利点があるにもかかわらず、複数のサービスでデータベースを共有することは、課題やデメリットをもたらす可能性があります。
・データ結合と依存関係
・パフォーマンスのボトルネック
・自律性と所有権の欠如
・データの整合性と一貫性
・スケーラビリティとデプロイの柔軟性

マイクロサービスごとに1つのデータベースを利用することが望ましい。
・サービスの自律性と分離
・データ管理の簡素化
・パフォーマンスとスケーラビリティの向上
・明確な所有権と責任
・データの一貫性と整合性の簡素化
・攻撃対象領域の制限
・データの分離
・関心事の分離
・監査とコンプライアンス

Sagaパターン
トランザクションに関与する各サービスはそれぞれのパートを実行し、タスクの完了や進捗を示すイベントを発行する。
トランザクションに関心のある他のサービスはこれらのイベントをリッスンし、それに応じてタスクを継続する。

最終的な一貫性の問題
分散システムでは、最終的な一貫性とは、データの更新がすべてのノード間で即座に同期されないモデルである。
その代わりに、一時的な不整合が許容され、システムが一貫性のある状態に収束するまで、更新は徐々に伝播される。
・コンフリクト
・読み取り修復
・アンチエントロピー機構
・クォーラムシステム
・補償措置
・冪等性

memoO'REILLY Learning

Posted by shi-n