分散システムとは? 多数のマシン、一つのシステム
分散システムとは、そのコンポーネントが複数のネットワーク接続されたマシン上で動き、単一のシステムとして振る舞うよう協調するものです。
システムが二台以上のマシンにまたがり、それらがネットワーク越しに通信した瞬間、あなたは分散システムと、新しい種類の問題を手にします。ネットワークは遅くなったり、メッセージを落としたり、分断されたりします。マシンは独立して故障します。時計は食い違います。現代ソフトウェアのほとんどのアーキテクチャパターンは、これらの現実を飼いならすために存在します。
何が分散にするのか
コンポーネントは別々のマシン上で動き、完全には制御できないネットワーク越しに協調します。単一プロセスと違って共有メモリもグローバルな時計もないため、合意と順序付けが現実の工学的問題になります。
厳しい真実
- ネットワークは信頼できません: メッセージは失われたり、遅延したり、重複したりします。
- マシンは独立して、また部分的に故障します。
- 完全に同期したグローバルな時計は存在しません。
- 分断はシステムを、通信できない島々に分けうります。
これに応えるパターン
バックオフ付きリトライ、冪等性、タイムアウト、サーキットブレーカー、結果整合性はすべて、ネットワークとマシンが信頼できないために存在します。障害モデルを知ることが、ある問題にどのパターンが必要かを教えてくれます。
テストがより難しくなる理由
分散的な振る舞い (分断、遅いノード、部分的な障害) は、ユニットテストにはめったに現れません。CIには複数のコンポーネントを立ち上げる統合テストが必要で、理想的には、落ちたメッセージやダウンしたノードをシミュレートするフォールトインジェクションのテストで、障害下でのみ現れるバグを捕まえます。
ダウンタイムなしのデプロイ
分散システムのデプロイで世界を止めることはできません。rollingやblue-greenのデプロイ、後方互換のある契約、health checkにより、システムがトラフィックを処理し続けながら一度に一ノードずつ更新できます。
本質的により重いパイプライン
現実的な分散テストは実行ごとに複数のサービスを起動し、これはCIの大きなコストです。素早いプロビジョニングを備えたウォームなrunner (Latchkeyが提供するもの) は、それらの複数コンポーネントのスイートがキューで飢えないようにします。
重要なポイント
- 分散システムは、一つとして振る舞う複数のネットワーク接続されたマシンにまたがります。
- その中核的な難しさは、信頼できないネットワーク、独立した障害、グローバルな時計の不在です。
- レジリエンスパターンと、複数コンポーネントのフォールトインジェクションテストがそれを管理する手段です。