# ネットワークサービス依存性発見
## 定義
ネットワークサービス依存性発見(Network Service Dependency Discovery)とは、大規模分散システムにおいて、どのネットワークサービスがどのネットワークサービスに依存しているかを、手動設定調査ではなく自動的・受動的に特定する取り組みである。ネットワークサービスは (ip, port, protocol) の三つ組で表現され、依存性 A→B は「A の動作に B へのアクセスが必要」という関係を指す。Peddycord+ LISA 2012([[@2012__LISA__On the Accurate Identification of Network Service Dependencies in Distributed Systems]])が問題の定式化と解法を詳しく扱っている。
依存性は二種類ある。**ローカル-リモート依存**は A が直接 B を呼び出す関係で、本番ネットワークで最も一般的。**リモート-リモート依存**はクライアントが A にアクセスするために事前に B を参照する必要がある関係(例: DNS 解決)。
## アプローチの分類
### ホストベース手法
Macroscope・Magpie・Pinpoint・X-Trace・Constellation が代表例。エージェントをホストにインストールしプロセスレベルの情報を取得する。精度が高いが、セキュリティ・性能・管理のオーバーヘッドが導入障壁となる。
### ネットワークベース手法
各ホストをブラックボックスとして扱い、ネットワークトラフィックのみを受動的に解析する。エージェント不要で導入が容易。Sherlock・eXpose・Orion・NSDMiner が代表例。
**NSDMiner のコアアイデア**: サービス A がクライアント C のセッション中に別のサービス B へフローを開始するという「ネスト化されたフロー」パターンから A→B の依存性を検出する。
## 信頼スコアリング手法
### 比率ベース(NSDMiner 初版)
依存候補 A→B のスコアを `weight(A→B) / weight(A)` と定義。観測量の多寡がスコアに反映されないため、少ない観測でも高スコアが付く問題がある。
### 対数ベース(Peddycord+ LISA 2012)
依存候補 A→B のスコアを `log_{weight(A)}(weight(A→B))` と定義。対数の二性質により(1)データ量の多い候補を適切に高評価、(2)観測が増えるに従い追加の確信増分が逓減——より確率的に適切なスコアが得られる。実験評価では偽陽性を 133→78 件(共有モード)に削減しつつ真陽性 96 件を維持。
## 三つの拡張技法(LISA 2012)
1. **対数ベースランキング**: スコアリングを比率から対数に変更し偽陽性を削減
2. **依存性推論**: 利用頻度の低いサービスの依存性を、類似サービスグループの共通依存性から推論して偽陰性を削減
3. **サービスクラスタ自動検出**: ロードバランシング・バックアップ用の冗長サービス群を検出し候補数を 25〜50% 削減
## 横断的知見
- **受動的手法はエージェント不要だが「相関≠因果」という構造的弱点を持つ**: ネットワークトラフィックを受動的に観測する手法はエージェント不要で導入が容易だが、「相関は因果でない」ために偽陽性が本質的に多い。Peddycord+ LISA 2012([[@2012__LISA__On the Accurate Identification of Network Service Dependencies in Distributed Systems]])が対数スコアリングで偽陽性を削減したが、根本的解決ではない。Zand+ INFOCOM 2014([[@2014__INFOCOM__Rippler Delay Injection for Service Dependency Detection]])の Rippler は「遅延が伝播するか」を直接テストする能動的手法でこの限界を構造的に解消した。ただし能動的手法はセンサ配置制約と実験時間が必要というコストを払う。(Source: [[@2012__LISA__On the Accurate Identification of Network Service Dependencies in Distributed Systems]], [[@2014__INFOCOM__Rippler Delay Injection for Service Dependency Detection]])
- **Sherlock(2007)→ Orion(2008)→ NSDMiner(2012)→ Rippler(2014)の 4 世代は、各世代が前世代の残した問題を 1 つずつ解決する漸進的改善系譜をなす**: Sherlock は「最頻使用サービスを全依存とみなす偽陽性」、Orion は「遅延スパイク相関の低確度」、NSDMiner は「比率スコアリングの多量観測優遇不足」を改善し、Rippler は「受動的手法全体の相関≠因果問題」にアプリケーション非依存能動アプローチで答えた。各世代が直前の問題を解いた一方で新たな制約(Rippler はセンサ配置・事前サービスリスト必要)を導入している点も共通する。(Source: [[@2007__SIGCOMM__Towards Highly Reliable Enterprise Network Services via Inference of Multi-level Dependencies]], [[@2008__OSDI__Automating Network Application Dependency Discovery - Experiences, Limitations, and New Solutions]], [[@2012__LISA__On the Accurate Identification of Network Service Dependencies in Distributed Systems]], [[@2014__INFOCOM__Rippler Delay Injection for Service Dependency Detection]])
- **依存性スコアリングに対数を使うことで「観測数の多寡を確率推定に組み込む」**: NSDMiner 対 LISA 2012 の比率→対数置換は、確率論的手法一般に汎化できる設計選択である。多量観測が低信頼スコアに集中する比率ベースの欠陥は他のネットワーク分析ツールでも再現する可能性がある。(Source: [[@2012__LISA__On the Accurate Identification of Network Service Dependencies in Distributed Systems]])
- **サービスクラスタ(ロードバランシング・バックアップ)は外乱であり同時に構造情報でもある**: クラスタを先に発見して集約すれば依存性発見問題が単純化される。LISA 2012 はこの自動検出を実装し候補を 25〜50% 削減。Rippler はロードバランシング依存性をそもそも検出できないと明言しており、クラスタ問題は設計上スキップされた(Source: [[@2012__LISA__On the Accurate Identification of Network Service Dependencies in Distributed Systems]], [[@2014__INFOCOM__Rippler Delay Injection for Service Dependency Detection]])
## 未解決の問い
- 現代のマイクロサービスアーキテクチャ(サービスメッシュ・sidecar プロキシ・Envoy 等)において NSDMiner/Rippler のネストフローパターンや遅延伝播パターンは有効か。mTLS/暗号化が普及した環境では。
- コンテナ・Kubernetes 環境では IP アドレスが頻繁に変わるが、(ip, port, protocol) ベースの表現はそのまま使えるか。Pod IP の動的割り当てへの対応は。
- Rippler はバックアップ・ロードバランシング依存性を検出できないと明言する。これらを検出する代替手法は存在するか。受動的手法の方がむしろこの種の依存性を「誤って」検出できる皮肉はないか。
- 遅延注入が「大規模本番システムへの適用」に際し各サービスへの実験時間をどう短縮するか。現代のサービスメッシュ環境(Istio の delay fault injection 機能)との統合は可能か。
- NSDMiner の O(n²) 依存グラフ生成は数億フロー規模で数日を要する。分散・近似アルゴリズムで実用速度まで改善できるか。
- 受動的手法と能動的手法を組み合わせたハイブリッドアプローチは有効か。例えば受動的手法で候補を絞り、能動的手法で偽陽性を除去するパイプラインなど。
## 関連
- [[@2012__LISA__On the Accurate Identification of Network Service Dependencies in Distributed Systems]] — NSDMiner(受動的手法の第 3 世代)
- [[@2014__INFOCOM__Rippler Delay Injection for Service Dependency Detection]] — Rippler(能動的・アプリケーション非依存の第 4 世代)
- [[@2007__SIGCOMM__Towards Highly Reliable Enterprise Network Services via Inference of Multi-level Dependencies]] — Sherlock(受動的ホストベース)
- [[@2008__OSDI__Automating Network Application Dependency Discovery - Experiences, Limitations, and New Solutions]] — Orion(受動的ネットワークベース)
- [[Barry Peddycord III]] / [[Peng Ning]] — NSDMiner 提案者
- [[Ali Zand]] / [[Giovanni Vigna]] / [[Christopher Kruegel]] — Rippler 提案者
- [[NSDMiner]] — 受動的手法の実装
- [[遅延注入]] — Rippler が採用する能動的手法
- [[マイクロサービスコールグラフ]] — 現代での発展形(サービスメッシュ時代の依存グラフ)
- [[オブザーバビリティ]] — 上位概念
## 出典
- Peddycord, Barry, III, Peng Ning, and Sushil Jajodia. "On the Accurate Identification of Network Service Dependencies in Distributed Systems." *USENIX LISA 2012*, pp. 181–194.
- Zand, Ali, Giovanni Vigna, Richard Kemmerer, Christopher Kruegel. "Rippler: Delay Injection for Service Dependency Detection." *IEEE INFOCOM 2014*, pp. 2157–2165.