分散システムのパターンカタログ

2023年11月23日

分散システムは、プログラミングにおいて特有の課題をもたらします。多くの場合、データの複数のコピーが必要になり、それらを同期する必要があります。しかし、処理ノードが確実に動作するとは限らず、ネットワーク遅延は容易に不整合につながる可能性があります。それにもかかわらず、多くの組織は、データストレージ、メッセージング、システム管理、およびコンピューティング能力を処理する、一連の中核となる分散ソフトウェアに依存しています。これらのシステムは共通の問題に直面しており、同様の解決策でそれらに対処しています。

2020年、私はこれらの解決策をパターンとして収集し始め、開発するにつれてこのサイトで公開しました。2023年には、これらが書籍「Patterns of Distributed Systems」として出版されました。このサイトでは、各パターンの短い概要と、oreilly.comのオンラインeBook版の関連する章への深いリンク(このページでは でマークされています)を提供しています。

Clock-Bound Wait  oreilly.comの章へのリンク

クラスタノード間での時間の不確実性を考慮して、値の読み書きを行うことで、クラスタノード間で値を正しく順序付けることができます。

Consistent Core  oreilly.comの章へのリンク

より強力な整合性を提供する小さなクラスタを維持することにより、クォーラムベースのアルゴリズムを実装せずに、大規模なデータクラスタがサーバーアクティビティを調整できるようにします。

Emergent Leader  oreilly.comの章へのリンク

クラスタ内での年齢に基づいてクラスタノードを順序付けることで、明示的な選挙を実行せずにノードがリーダーを選択できるようにします。

Fixed Partitions  oreilly.comの章へのリンク

パーティションの数を固定することで、クラスタのサイズが変更された場合でも、データからパーティションへのマッピングを変更せずに維持します。

Follower Reads  oreilly.comの章へのリンク

フォロワーから読み取りリクエストを処理することで、より高いスループットとより低いレイテンシを実現します。

Generation Clock  oreilly.comの章へのリンク

サーバーの世代を示す単調増加数。

Gossip Dissemination  oreilly.comの章へのリンク

ノードのランダムな選択を使用して情報を渡すことで、ネットワークをフラッディングすることなく、クラスタ内のすべてのノードに情報が確実に到達するようにします。

HeartBeat  oreilly.comの章へのリンク

定期的にメッセージを他のすべてのサーバーに送信することで、サーバーが利用可能であることを示します。

High-Water Mark  oreilly.comの章へのリンク

最後に成功したレプリケーションを示す、ライトアヘッドログ内のインデックス。

Hybrid Clock  oreilly.comの章へのリンク

システムタイムスタンプと論理タイムスタンプを組み合わせてバージョンを日付と時刻として持ち、それらを順序付けることができます。

Idempotent Receiver  oreilly.comの章へのリンク

クライアントからのリクエストを一意に識別することで、クライアントが再試行したときに重複リクエストを無視できます。

Key-Range Partitions  oreilly.comの章へのリンク

データをソートされたキー範囲に分割して、範囲クエリを効率的に処理します。

Lamport Clock  oreilly.comの章へのリンク

値のバージョンとして論理タイムスタンプを使用することで、サーバー間で値の順序付けを可能にします。

Leader and Followers  oreilly.comの章へのリンク

一連のサーバー間でレプリケーションを調整するための単一のサーバーを備えています。

Lease  oreilly.comの章へのリンク

時間ベースのリースをクラスタノードに使用して、それらのアクティビティを調整します。

Low-Water Mark  oreilly.comの章へのリンク

ライトアヘッドログ内のインデックスで、ログのどの部分を破棄できるかを示します。

Majority Quorum  oreilly.comの章へのリンク

すべての決定を行うために過半数を必要とすることで、2つのサーバーグループが独立して決定を行うことを防ぎます。

Paxos  oreilly.comの章へのリンク

ノードが切断された場合でも、安全なコンセンサスに達するために、2つのコンセンサス構築フェーズを使用します。

Replicated Log  oreilly.comの章へのリンク

すべてのクラスタノードにレプリケートされるライトアヘッドログを使用して、複数のノードの状態を同期します。

Request Batch  oreilly.comの章へのリンク

複数のリクエストを組み合わせて、ネットワークを最適に使用します。

Request Pipeline  oreilly.comの章へのリンク

前のリクエストの応答を待たずに接続上に複数のリクエストを送信することで、レイテンシを改善します。

Request Waiting List  oreilly.comの章へのリンク

他のクラスタノードからの応答に基づいて応答する基準が満たされた後に応答を必要とするクライアントのリクエストを追跡します。

Segmented Log  oreilly.comの章へのリンク

操作を容易にするために、ログを1つの大きなファイルではなく複数の小さなファイルに分割します。

Single-Socket Channel  oreilly.comの章へのリンク

単一のTCP接続を使用して、サーバーに送信されたリクエストの順序を維持します。

Singular Update Queue  oreilly.comの章へのリンク

呼び出し元をブロックせずに順序を維持するために、単一のthreadを使用して非同期的にリクエストを処理します。

State Watch  oreilly.comの章へのリンク

サーバー上の特定の値が変更されたときにクライアントに通知します。

Two-Phase Commit  oreilly.comの章へのリンク

複数のノード上のリソースを1つのアトミック操作で更新します。

Version Vector  oreilly.comの章へのリンク

クラスタノードごとに1つのカウンタのリストを維持して、同時更新を検出します。

Versioned Value  oreilly.comの章へのリンク

新しいバージョンで値へのすべての更新を保存して、履歴値の読み取りを可能にします。

Write-Ahead Log  oreilly.comの章へのリンク

ストレージデータ構造をディスクにフラッシュすることなく、すべての状態変更をアペンドオンリーのログへのコマンドとして永続化することにより、耐久性を保証します。