運用と→管理サービスの依存関係
サービスの依存関係
1)なぜそれを必要とします
すべてのプロダクションプラットフォームは、ユーザー→エッジ/API→ドメインサービス→ターン/ストリーム→DB/キャッシュ→外部プロバイダ(支払い、KYC、ゲームのプロバイダ)です。グラフの1つのエッジにエラーが発生すると、ネットワーク全体を「歩く」ことがよくあります。遅延が増加し、リトレイがトリガーされ、キューが詰まり、カスケード障害が発生します。依存性管理は「ブラスト半径」を減らし、リリースを予測可能にします。
目的:- コールの完全なグラフを参照して、誰に依存するかを理解してください。
- カスケード障害と「リトレイストーム」を防止します。
- 互換性とSLOプロモーションに基づいてリリースを計画します。
- MTTRを上げる:真の根本原因をより速く見つける。
2)依存関係の種類
同期(RPC: REST/gRPC/GraphQL):レイテンシー/可用性によるハード接続。タイムアウト、ブレーカー、リトレイの予算が必要です。
非同期(Event/Stream: Kafka/Rabbit/Pulsar):より安定した接続性がありますが、lag/backlogとdelivery semantics(最低1回、idempotency)があります。
ストレージ(DB/キャッシュ/オブジェクトストア):共有リソース→コンテンツ、接続制限/IOPS、立ち退き、レプリケーション。
外部プロバイダ(PSP/KYC/ゲームプロバイダ):クォータ、通話料、サービスウィンドウ、法的SLA。
操作(リリース、phicheflags、 configs):設定、シークレット、スキーマレジストリを介した間接依存。
3)サービスカタログと依存関係グラフ
ディレクトリ(Backstage/Service Catalog/CMDB)で修正するもの:- オーナー(Squad/chat/On-call rota)、リポジトリ、環境、アーティファクト。
- API契約(OpenAPI/AsyncAPI)、バージョン、互換性(バック/フォワード)。
- タイプ(同期/非同期)、重大性、SLO期待を持つ着信/発信依存性(上流/下流)。
- タイムアウト/リトリート予算、ブレーカー、隔壁プール。
- クォータと外部統合の限界に関するデータ。
- 'service: payment-api'
- 上流:'user-profile' (sync)、 'risk-score' (async)。
- Downstream: 'PSP-X'(同期)、'ledger'(非同期)。
- SLO: p99 ≤ 300ms、 99。9%の稼働時間。
- タイムアウト:200ミリ秒から'PSP-X'、 150ミリ秒から'ユーザープロファイル'。
- Retrai: 2指数遅延、ジッタ。
- ブレーカ:30年代は5%エラー/10秒で開きます。
4) SLOプロパガンダと「遅延予算」
同期コールのチェーンでは、合計SLOは遅延と失敗確率の合計から形成されます。
原則:- リクエストの予算は、フロントエンドのSLO 500 ms→Edge 50 ms→API 150 ms→ドメインサービス200 ms→プロバイダ100 msです。
- タイムアウトは「in」よりも短い:発信者は、リソースが更新され、ゾンビの呼び出しが蓄積されないように、全体の内部タイムアウトよりも短いタイムアウトを持っています。
- Retraiは、安全なコード/例外およびジッタ付きの場合にのみ使用できます。ボトルネックタイムアウト(別名「嵐」)のためのリトレイはありません。
5)契約と相互運用性
APIバージョン管理:契約のためのSemVer;「オプション」フィールドを介した後方互換性のある変更、スキーマ拡張;削除-「廃止期間」を通じてのみ。
消費者主導の契約(CDC):消費者テスト(Pact-like)は、CIのプロバイダに対して実行されます。互換性がない場合、リリースはブロックされます。
スキーマの登録(非同期):トピック/イベントのバージョン、スキーマの進化(Avro/JSON-Schema)、 can-read-old/can-write-newポリシー。
6)エンジニアリングの安定性パターン
タイムアウト:ビジネスSLAを技術的な期待から分離する。各発信接続は明示的なタイムアウトです。
Retries+backoff+jitter: idempotenceを指定した場合、2〜3回以上試行しません。
遮断器:下流の低下の「急速な低下」;ハーフオープントライアル。
隔壁(プール分離):異なるダウンストリームの場合-ストリーム/フロア/接続の個別のプール。
Rate-limit/Leaky-Bucket:ピーク時にダウンストリームを殺さないようにします。
Idempotency&deduplication: request/message level idempotency key;祖父-leiterとリトリートキュー。
キャッシュとフォールバック:ローカル/分散キャッシュ、古いwhile-revalidateステータス、コンテンツの劣化。
outbound:
psp-x:
timeout_ms: 200 retries: 2 retry_on: [5xx, connect_error]
backoff: exponential jitter: true circuit_breaker:
error_rate_threshold: 0. 05 window_s: 10 open_s: 30 pool: dedicated-psp (max_conns: 200)
7)依存関係の可視性
分散トレース(TraceID、手荷物): リンクでリクエストのパスを参照してください。ピアタグを使用して発信コールにスパンします。サービス'、'retry'、'timeout'
依存性別:'outbound_latency_p99'、 'outbound_error_rate'、 'open_circuit'、 'retry_count'、 'queue_lag'。
アップストリーム/ダウンストリームのダッシュボード:- SLOと誤ったエッジの色分けされたサービスマップ。
- 先週の「Top N problem dependencies」。
- 「ブラスト半径」-Xの秋によって影響を受けるサービスのリスト。
- 相関ログ:ログに'trace_id'/'span_id'を含める。
8)依存関係に対応したリリース管理
依存性対応パイプライン:消費者CDCテストが赤色の場合、プロバイダのリリースがブロックされます。
段階的包含(phicheflags):新しいフィールド/エンドポイント→消費者の1%→10%→100%。
カナリアリリース:トラフィックの共有に関する主な依存関係と「遅延予算」をチェックします。
スキームの互換性:プロデューサーは'vNew'を書き込み、消費者は'vOld/vNew'を読みます。移行後-古いフィールドの「ガベージコレクション」。
9)列によるインシデントとエスカレーション
私たちは「真の犯人」を定義します:alert-correlation-'PSP-X'が劣化している場合、私たちは「支払いブッシュ」全体をページしませんが、統合の所有者です。
Autodegradation: phicheflag 「minimum mode」(重量の少ないエンドポイント、トリムバンドル、重要でない機能の無効化)。
カスケードからのガード:並列性を制限し、ホットブランチでレトラをオフにし、事前にブレーカを開きます(プレオープン)。
- Diagnostics:ダッシュボード/メトリック、クォータ/リミットの確認方法。
- アクション:RPSを削減し、バックアッププロバイダに切り替え、一時的にキャッシュ応答を有効にします。
- ロールバックと検証:リターンパラメータ、ノルムがp95/p99とエラーレートであることを確認します。
10)依存関係の臨界性マトリックス
軸に沿って各リンクを評価します: ルール:- 「重要」-ダブルプロビジョニング、ブレーカ、個々のプール、カオステスト。
- 「high」-少なくとも劣化と「green button」機能をオフにします。
- 「中/低」の場合-リトレイの制限とキューの予算。
11)プロセス: 目録から操作への
1.グラフマッピング:ディレクトリから実際の呼び出し(トレース)+宣言的依存関係を収集します。
2.所有者の割り当て:各サービスと外部統合-責任あるオンコール。
3.SLOと予算の定義:レイテンシ/エラー、タイムアウト/リトレイ/プール。
4.コントラクトの形式化:OpenAPI/AsyncAPI、スキーマ、CDC。
5.安定性パターンを有効にする:タイムアウト/リトライ/回路/隔壁。
6.依存関係ごとにダッシュボードとアラートを設定します。
7.release gates: blockをCDC/compatibility/canaryでインストールします。
8.通常のゲームの日:落下キーエッジのカオス実験。
9.コミュニケーションに焦点を当てた死後:カスケードを強化したもの、半径を狭める方法。
12)中毒に関する警告(ルールのアイデア)
同期ダウンストリーム:- 'outbound_error_rate {to=」X」}> 3% FOR 10m'→warning;'>5% FOR 5m'→critical。
- 'outbound_p99_latency {to=」X」}> SLO1。3 FOR 10m'→警告。
- 'circuit_open {to=」X「}==1 FOR 1m'→インテグレーションオーナーへのページ。
- 'retry_rate {to=」X「}>baseline2 FOR 5m'+'outbound_rps> 0'→storm risk。
- 'consumer_lag {topic=」Y」} growth>しきい値FOR 10m'+'hpa at max'→\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- 'usage_quota {provider=」PSP-X「}>90% window'→warning、 auto-switch routes。
13)アンチパターン
"すべてのダウンストリームのための1つの一般的なストリームプール。"Total:ヘッド・オブ・ライン・ブロッキング。プールを分割します。
タイムアウトなし/無限のリトレース。だから嵐が生まれます。
非idempotent外科手術のブラインドリトレイ。書き込み/ベットを複製します。
接続ポイントとして非表示の「共有DB」。強力な競争と閉塞。
APIバージョンはCDCおよび非推奨プランなしで変更されます。キャッチマスフォール。
接続によってではなく、サービスによってのみ観測可能。チェーンが壊れる場所は見えません。
14)ダッシュボード: 最小セット
サービスマップ:エッジメトリック(レイテンシ/エラー/ボリューム)を持つサービスのインタラクティブマップ。
Upstream/Downstream概要:サービスの所有者-着信依存(呼び出している人)、発信(呼び出している人)、「トップの問題」。
依存関係ドリルダウン:リンク固有のカード:p50/p95/p99、クラスエラー、オープンブレーカの割合、リトレイ、接続プール、クォータ/コスト。
Release Context:依存関係グラフに対するリリース/phicheflagsの注釈。
15)実装チェックリスト
- オーナーと契約を持つサービスのディレクトリ(OpenAPI/AsyncAPI)。
- トレースからの依存関係の完全なグラフ(毎日更新)。
- サービスによるSLOとチェーン下の「レイテンシ予算」。
- 明示的なタイムアウト、ジッタ後退、ブレーカー、隔壁分離。
- リリースゲートとしてCIでのCDCテスト。
- 依存関係とサービスカードごとのダッシュボード。
- エッジのアラート+根本原因による抑制。
- Game-days: provider/cluster/topic dropとdegradation check。
- 劣化計画:どの機能をオフにするか、どのキャッシュをオンにするか。
- 接続性を低下させるアクションを伴う定期的な死後。
16)依存性管理の品質KPI
依存関係MTTR:リブ回復の中央値。
Blast Radius Index:影響を受けるサービスの平均数。
カップリングスコア:すべての同期依存の割合;下降トレンド。
CDCパスレート:契約違反のないリリースの%。
Retry Storms/Month Target→0。
外部コールのコスト:1k RPSあたりの外部コールのコスト(キャッシュ/フォールバックの効果を参照)。
17)高速開始(デフォルト)
タイムアウト:リンク予算の70-80%;リクエストupper timeout<内部の合計。
Retrai: max 2、 idempotent 5xx/networkのみ、バックオフ+ジッタ付き。
ブレーカ:10秒で5%エラーのしきい値、open=30秒、半開きサンプル。
隔壁:下流ごとの専用プール/接続制限。
CDC:すべての公開APIとトピックに必須です。
Async-preference:可能な場合-イベント/キューに切り替える(時間内にデカップリング)。
18) FAQ
Q:何がより重要です:後退またはブレーカーか?
A:どちらも。レトライは短期的な故障から救い、ブレーカは永久的な劣化と嵐から保護します。
Q:どのように接続が「壊れやすい」ことを知っていますか?
A:高い間違いの相関、低いタイムアウトのマージン、頻繁なレトレイ、follbacks/cachesの同期長いチェーン無し。
Q:統合テストがある場合、なぜCDCですか?
A: CDCは、コンシューマーの期待を捉え、互換性がない場合にプロバイダのリリースを破る-コードが本番環境に入る前に。