Skip to content
Latchkey

分散システムとは? 多数のマシン、一つのシステム

分散システムとは、そのコンポーネントが複数のネットワーク接続されたマシン上で動き、単一のシステムとして振る舞うよう協調するものです。

システムが二台以上のマシンにまたがり、それらがネットワーク越しに通信した瞬間、あなたは分散システムと、新しい種類の問題を手にします。ネットワークは遅くなったり、メッセージを落としたり、分断されたりします。マシンは独立して故障します。時計は食い違います。現代ソフトウェアのほとんどのアーキテクチャパターンは、これらの現実を飼いならすために存在します。

何が分散にするのか

コンポーネントは別々のマシン上で動き、完全には制御できないネットワーク越しに協調します。単一プロセスと違って共有メモリもグローバルな時計もないため、合意と順序付けが現実の工学的問題になります。

厳しい真実

  • ネットワークは信頼できません: メッセージは失われたり、遅延したり、重複したりします。
  • マシンは独立して、また部分的に故障します。
  • 完全に同期したグローバルな時計は存在しません。
  • 分断はシステムを、通信できない島々に分けうります。

これに応えるパターン

バックオフ付きリトライ、冪等性、タイムアウト、サーキットブレーカー、結果整合性はすべて、ネットワークとマシンが信頼できないために存在します。障害モデルを知ることが、ある問題にどのパターンが必要かを教えてくれます。

テストがより難しくなる理由

分散的な振る舞い (分断、遅いノード、部分的な障害) は、ユニットテストにはめったに現れません。CIには複数のコンポーネントを立ち上げる統合テストが必要で、理想的には、落ちたメッセージやダウンしたノードをシミュレートするフォールトインジェクションのテストで、障害下でのみ現れるバグを捕まえます。

ダウンタイムなしのデプロイ

分散システムのデプロイで世界を止めることはできません。rollingやblue-greenのデプロイ、後方互換のある契約、health checkにより、システムがトラフィックを処理し続けながら一度に一ノードずつ更新できます。

本質的により重いパイプライン

現実的な分散テストは実行ごとに複数のサービスを起動し、これはCIの大きなコストです。素早いプロビジョニングを備えたウォームなrunner (Latchkeyが提供するもの) は、それらの複数コンポーネントのスイートがキューで飢えないようにします。

重要なポイント

  • 分散システムは、一つとして振る舞う複数のネットワーク接続されたマシンにまたがります。
  • その中核的な難しさは、信頼できないネットワーク、独立した障害、グローバルな時計の不在です。
  • レジリエンスパターンと、複数コンポーネントのフォールトインジェクションテストがそれを管理する手段です。

関連ガイド