## 定義 分散コンピューティングの誤謬(fallacies of distributed computing)とは、1994年にPeter Deutschが発表した、分散システムを設計・実装する際に暗黙のうちに置かれがちな、しかしほとんど常に誤りである前提のリストである。ネットワークの信頼性・レイテンシ・帯域幅に関する仮定を中心に、ネットワークのセキュリティ、敵意を持つ者の不在、トポロジの不変性、伝送コストの不在、ネットワーク全体を把握・制御する単一の権威的存在といった項目を含む。分散システムの設計時に「操作は常に成功し、何も問題は起きない」と仮定することは危険であり、その仮定が誤りだったと判明した場合、システムは予測が困難または不可能な動作を引き起こす。(Source: [[@2021__OReillyJapan__詳説 データベース - Chapter 8 基本事項の紹介と概要]] §8.2) 具体的に本章が扱う誤謬は以下のとおりである。 - **ネットワークは信頼できるという誤謬**: 接続の確立に成功しても、リンクの安定は保証されない。接続は中断されうるし、メッセージは到達しても応答が失われることがある。 - **レイテンシはゼロという誤謬**: リモート呼び出しがローカル呼び出しと同じ速度であることは期待できない。メッセージがリモートサーバーに到達するには複数のソフトウェアレイヤと物理的媒体を経由する必要があり、これらは瞬時には行われない。 - **帯域幅は無限という誤謬**: メッセージの数・流量・サイズを増加させる、あるいは既存のネットワークに新しいプロセスを追加する際に、帯域幅が無限であるという前提を置くべきではない。 - **クロックは同期しているという誤謬**: リモートマシン上のクロックが同期していることを仮定するのは危険であり、特殊な高精度の時刻ソースを使わない限り、タイムスタンプに依拠して同期や順序付けを行うべきではない。 - **状態は一貫しているという誤謬**: すべてのノードで状態には完全な一貫性があると仮定すると微妙なバグにつながる。Apache Cassandraのスキーマ伝播バグやリングビュー不一致バグはこの誤謬が現実に引き起こした障害の例である。 - **ローカル実行とリモート実行は等価という誤謬**: 同じインターフェースの背後にローカル/リモート呼び出しを隠蔽することは便利だが、一貫性・配信・データの調停・ページング・マージ・並行アクセスの意味合いを覆い隠し誤解を招く。 - **障害は起きないという誤謬**: すべてのノードが正常に機能していることを前提に使用を始めるのはよいが、常にそうであると考えるのは危険である。プロセスには障害が付きもので、最良の方策は障害への準備を整えることである。 (Source: [[@2021__OReillyJapan__詳説 データベース - Chapter 8 基本事項の紹介と概要]] §8.2〜§8.2.5) ## 横断的知見 - 現時点では『詳説 データベース』第8章が唯一のソースであり、横断的知見はまだ蓄積されていない。DDIAの「部分故障」「システムモデルと安全性・活性」やSREBookの障害モデル論と突き合わせることで、誤謬のリストが具体的にどの障害モデル・システムモデルの前提崩壊に対応するかを整理できる可能性がある。 ## 未解決の問い - 分散コンピューティングの誤謬(1994年、Peter Deutsch)は列挙的なチェックリストであるのに対し、[[システムモデルと安全性・活性]]が扱う同期/非同期/部分同期モデルやノード故障モデルは形式的な分類である。両者を対応づけるマッピング(どの誤謬がどのシステムモデルの前提崩壊に相当するか)は作成できるか。 - ネットワーク分断(§8.2.6)やカスケード障害(§8.2.7)は誤謬リストそのものではなく、誤謬が現実に引き起こす結果として本章に位置づけられている。この「誤謬→結果」の因果関係を体系的に整理する価値はあるか。 - 誤謬リストが1994年当時に想定していたネットワーク環境(オンプレミス・単一データセンター中心)と、現代のマルチリージョン・クラウドネイティブな分散システムとで、各誤謬の相対的な重要度はどう変化したか。 ## 関連 - ソース: [[@2021__OReillyJapan__詳説 データベース - Chapter 8 基本事項の紹介と概要]] - 概念: [[分散システム障害]] / [[部分故障]] / [[システムモデルと安全性・活性]] - 実体: [[Apache Cassandra]](状態一貫性の誤謬の実例) ## 出典 - Alex Petrov, *詳説 データベース*, オライリー・ジャパン, 2021, 8章, §8.2.