分散システムのパターンカタログ
分散システムは、プログラミングにおいて特有の課題をもたらします。多くの場合、データの複数のコピーが必要になり、それらを同期する必要があります。しかし、処理ノードが確実に動作するとは限らず、ネットワーク遅延は容易に不整合につながる可能性があります。それにもかかわらず、多くの組織は、データストレージ、メッセージング、システム管理、およびコンピューティング能力を処理する、一連の中核となる分散ソフトウェアに依存しています。これらのシステムは共通の問題に直面しており、同様の解決策でそれらに対処しています。
2020年、私はこれらの解決策をパターンとして収集し始め、開発するにつれてこのサイトで公開しました。2023年には、これらが書籍「Patterns of Distributed Systems」として出版されました。このサイトでは、各パターンの短い概要と、oreilly.comのオンラインeBook版の関連する章への深いリンク(このページでは でマークされています)を提供しています。
Clock-Bound Wait 
クラスタノード間での時間の不確実性を考慮して、値の読み書きを行うことで、クラスタノード間で値を正しく順序付けることができます。
Consistent Core 
より強力な整合性を提供する小さなクラスタを維持することにより、クォーラムベースのアルゴリズムを実装せずに、大規模なデータクラスタがサーバーアクティビティを調整できるようにします。
Emergent Leader 
クラスタ内での年齢に基づいてクラスタノードを順序付けることで、明示的な選挙を実行せずにノードがリーダーを選択できるようにします。
Fixed Partitions 
パーティションの数を固定することで、クラスタのサイズが変更された場合でも、データからパーティションへのマッピングを変更せずに維持します。
Follower Reads 
フォロワーから読み取りリクエストを処理することで、より高いスループットとより低いレイテンシを実現します。
Generation Clock 
サーバーの世代を示す単調増加数。
Gossip Dissemination 
ノードのランダムな選択を使用して情報を渡すことで、ネットワークをフラッディングすることなく、クラスタ内のすべてのノードに情報が確実に到達するようにします。
HeartBeat 
定期的にメッセージを他のすべてのサーバーに送信することで、サーバーが利用可能であることを示します。
High-Water Mark 
最後に成功したレプリケーションを示す、ライトアヘッドログ内のインデックス。
Hybrid Clock 
システムタイムスタンプと論理タイムスタンプを組み合わせてバージョンを日付と時刻として持ち、それらを順序付けることができます。
Idempotent Receiver 
クライアントからのリクエストを一意に識別することで、クライアントが再試行したときに重複リクエストを無視できます。
Key-Range Partitions 
データをソートされたキー範囲に分割して、範囲クエリを効率的に処理します。
Lamport Clock 
値のバージョンとして論理タイムスタンプを使用することで、サーバー間で値の順序付けを可能にします。
Leader and Followers 
一連のサーバー間でレプリケーションを調整するための単一のサーバーを備えています。
Lease 
時間ベースのリースをクラスタノードに使用して、それらのアクティビティを調整します。
Low-Water Mark 
ライトアヘッドログ内のインデックスで、ログのどの部分を破棄できるかを示します。
Majority Quorum 
すべての決定を行うために過半数を必要とすることで、2つのサーバーグループが独立して決定を行うことを防ぎます。
Paxos 
ノードが切断された場合でも、安全なコンセンサスに達するために、2つのコンセンサス構築フェーズを使用します。
Replicated Log 
すべてのクラスタノードにレプリケートされるライトアヘッドログを使用して、複数のノードの状態を同期します。
Request Batch 
複数のリクエストを組み合わせて、ネットワークを最適に使用します。
Request Pipeline 
前のリクエストの応答を待たずに接続上に複数のリクエストを送信することで、レイテンシを改善します。
Request Waiting List 
他のクラスタノードからの応答に基づいて応答する基準が満たされた後に応答を必要とするクライアントのリクエストを追跡します。
Segmented Log 
操作を容易にするために、ログを1つの大きなファイルではなく複数の小さなファイルに分割します。
Single-Socket Channel 
単一のTCP接続を使用して、サーバーに送信されたリクエストの順序を維持します。
Singular Update Queue 
呼び出し元をブロックせずに順序を維持するために、単一のthreadを使用して非同期的にリクエストを処理します。
State Watch 
サーバー上の特定の値が変更されたときにクライアントに通知します。
Two-Phase Commit 
複数のノード上のリソースを1つのアトミック操作で更新します。
Version Vector 
クラスタノードごとに1つのカウンタのリストを維持して、同時更新を検出します。
Versioned Value 
新しいバージョンで値へのすべての更新を保存して、履歴値の読み取りを可能にします。
Write-Ahead Log 
ストレージデータ構造をディスクにフラッシュすることなく、すべての状態変更をアペンドオンリーのログへのコマンドとして永続化することにより、耐久性を保証します。