シャドウトラフィックと比較
1)シャドウトラフィックとは何であり、なぜそれが必要なのか
シャドウトラフィック(別名トラフィックミラーリング/ダークローンチ)は、ユーザーに影響を与えることなく、プロダクションバージョンと並行してサービスの新しいバージョンへの実際のリクエスト/イベントの安全な「実行」です。新しいバージョンの結果はクライアントに返されず、外部副作用は発生しませんが、比較システムに収集されます。
主な目的:- 互換性のチェック:スキーム、契約、ビジネスロジック。
- 性能評価:レイテンシ、実際の負荷の下の抵抗。
- ドリフト検出:応答、分布、エラー率の違い。
- カナリアリリースの準備:トラフィックを実際に切り替える前にリスクを軽減します。
- カーネル/アルゴリズムを書き換え、データベース/キャッシュを移行し、別のランタイム/SDKに切り替え、外部APIのプロバイダを変更します。
2)シャドウトラフィックの建築パターン
2.1 L7プロキシ/ゲートウェイ(HTTP/gRPC)
プロキシはリクエストを受け入れる→古いバージョンからの戦闘応答を与える→非同期的にリクエストのコピーを「影」にミラーします。
同期APIに適しています。
フィルターコントロールの共有/ミラーリング:途中、ヘッダー、ユーザー、テナント。
yaml route:
route:
cluster: prod-v1 request_mirror_policies:
- cluster: shadow-v2 runtime_fraction:
default_value:
numerator: 10 # 10% denominator: HUNDRED trace_sampled: true
例(Nginx):
nginx location /api/ {
proxy_pass http://prod_v1;
mirror/shadow; # request copy
}
location = /shadow {
internal;
proxy_pass http://shadow_v2; # answer ignored
}
2.イベントバス2台(カフカ/スレッド)
トピックレベルでは、ティーが行われます:- プロデューサーはいつものように→prodの消費者が読む。
- 並行して、シャドウパイプラインは同じストリームを別のサンドボックスに読み込みます。
オプション:MirrorMaker/Replicator、 dual-write(注意)、source→prod+shadowブリッジ。
2.3リプレイヤー(レコード/プレイ)
リアルリクエスト/トレイルのスナップショット(PCAP/NGINXアクセス、gRPCタップ)→コントロールされたペースで「影」に再生。
2.4「合成影」
本番ログ+充填エッジケースのフェーズから負荷プロファイルを生成することは、機密性の制限に役立ちます。
3)状態および副作用の分離
黄金のルール:影は外の世界を変えません。
データベース/キャッシュまたは別のサンドボックス(スナップショット/レプリカ)へのリードオンアクセス。
発信副作用の禁止:支払い、手紙、綿毛、webhooks→stub/blackhole/record-only。
Command/POST idempotence: Shadowを元の繰り返しとして登録しないでください。
PII/シークレットマスキング、テストプロバイダートークン。
例: 鏡でのマスキング
yaml shadowFilter:
headers:
redact:
- Authorization
- X-Api-Key body:
jsonPaths:
- replace "$ .email" # with token
- "$.card. number"
4)サンプリングの作戦および安全なローディング
トラフィックシェア:開始時に1-10%;v2が予算内の場合は増加します。
選択基準:ルート、ユーザー、リクエストサイズ、操作タイプ(GETの方が安全)。
Perf予算:ミラーリングはp95/p99戦闘サービスを増やすべきではありません。影は常に非同期です。
背圧:シャドウチェーンが過熱したら、戦闘要求ではなく、影を落とします。
時間:diemおよびピークパターンごとにカバーする最低24-72時間。
5)結果の比較: 方法とレベル
5.1比較レベル
1.Byte diff: 1対1の応答/イベントのボディ。シンプルだが壊れやすい(タイムスタンプ、キーオーダー)。
2.セマンティック差分:フィールドの正規化と並べ替え、エペメリド(traceId、タイムスタンプ、カウンタ)を無視します。
3.ビジネス不変量:同じ量、ステータス、数量、境界。
4.統計分析:メートル分布は一致するか?(p50/p95のKSテスト、categorical χ ²)。
5.2比較ポリシー
マスク/フィールドのリストを無視(例:'updatedAt'、' etag')。
精度:数値の絶対/相対誤差(例:± 1e-6)。
許容バンド: "価格差≤ 0。01」、「+0エラー以下。1%相対prod"
コンパレータ擬似コード
pseudo compare(prod, shadow, policy):
a = normalize(prod, policy)
b = normalize(shadow, policy)
diffs = deepDiff(a, b, ignore=policy. ignore, floatTol=policy. floatTol)
invariants_ok = checkInvariants(a, b, policy. invariants)
return Result(diffs, invariants_ok)
5.3 zapros↔otvetの比較
相関IDが必要です。
リンク範囲:シャドートラックが戦闘へのリンクを取得します。
6)観察可能性と比較アーティファクト
メトリクス:- 'shadow_requests_total {route、……}'
- 'shadow_discrepancies_total {type=byte' semantic 'invariant}'
- 'shadow_error_ratio'''shadow_slo_breach_total'
- Perf: 'shadow_latencies_ms {p50、 p95、 p99}'
- 拡散ログ:キーによるコンパクトなJSONデルタ。
- レポート:トップNの不一致による毎日のレポート、ルート/テナント別のヒートマップ。
- UI 「diff explorer」: CSVでのタイプ、ルート、フィールド、エクスポートによるフィルタ。
7)特別な機会および微妙
7.1一貫性と一貫性
シャドウリクエストは後で/それ以前に来ることができます。バージョン/時間(Lamport/vector)またはウィンドウの公差に正規化します。
読み取り後:同期レプリケーションなしの読み取りレプリカ付きのシャドウは、異なる回答を提供します-遅延ウィンドウを比較します。
7.2キャッシュ/推奨事項
prodとshadowのキャッシュを混ぜないでください。
ML/recommendersの場合、オンラインメトリックとオフラインメトリックを個別に比較します。ドリフト入力機能を監視します。
7.3外部プロバイダ
レコードのみ/スタブモードでクライアントをラップします。
決済サービス(税金、料金)については、双方のディレクトリのスナップショットを修正します。
8)カナリアの並置/青緑
影:ユーザーへのゼロリスク、しかし実質の副作用;論理とperfに最適です。
カナリア:新しいバージョンからの実際の回答の少数の割合。既製のロールバック戦略とSLAが必要です。
青緑:検証後のインスタントスイッチング;影はその前でよく使われます。
9)実装計画(GitOps-style)
1.目標とメトリクス:不変量と公差がどのSLOに矛盾がないかをチェックします。
2.トレース:相関ID、分散トレースリンク。
3.プロキシ構成:ミラーポリシー、サンプリング、redaction。
4.分離:データベースサンドボックス/キャッシュ、サイドスタブ、テストキー。
5.コンパレータ:正規化、無視マップ、不変量、レポート。
6.負荷計画:1-5%から始めて下さい、緑のメートル法の20-50%まで成長。
7.可視性:「discrepancy/perf/volume」ダッシュボード。
8.終了基準:「0重要な矛盾48時間」「、エラーがprodより悪くない」「、perf in ± 5%」。
9.カナリアに移動:安全な共有と自動ガルダルールで実際の回答を含める。
10)構成例
10.1イスティオ(トラフィックミラーリング)
yaml apiVersion: networking. istio. io/v1beta1 kind: VirtualService spec:
hosts: ["svc. example"]
http:
- route: [{ destination: { host: svc, subset: v1 } }]
mirror:
host: svc subset: v2 mirrorPercentage:
value: 0. 1 # 10%
10.2カフカティー(スケッチ)
text source-topic -> prod-consumer-group
-> shadow-consumer-group (isolated sink/db)
10.3比較ルール(yamlポリシー)
yaml ignoreFields:
- $.traceId
- $.meta. generatedAt floatTolerance:
default: 1e-6 fields:
$.price: 0. 01 invariants:
- name: "nonNegativeTotal"
expr: "$.total >= 0"
- name: "statusMapping"
expr: "map($.status in ['ok','fail'], true)"
11)アンチパターン
影は書き出します:影からの実際の支払い/通知。
共有キャッシュ/共有キュー:相互影響と汚染。
正規化の欠如:クロック/キー順序によるバイト拡散は「赤」です。
外出先であまりにも高い割合:ペンプロッドの劣化。
長い「永遠の影」:第二のシステムは別々に住んでいて、現実から分散しています。
12)シャドウモード起動チェックリスト
- プロキシは共有とredactionを持つミラーで構成されます。
- Shadow isolated: DB/キャッシュ/外部統合-readonly/stubのみ。
- 相関IDはどこにでも投げられます。トレースはリンクされています。
- コンパレータは不変量を無視/正規化してチェックすることができます。
- ダッシュボードとアラートの不一致と負荷。
- ルート/テナントによるサンプリング;限界および背圧。
- 緑の光の公差と基準が定義されています。
- カナリア/ブルーグリーンおよびロールバック計画への移行。
13) FAQ
Q:シャドウとA/Bの違いは?
A: A/Bでは、両方のバージョンがユーザーに回答を返します(スプリット実験)。Shadowでは、新しいバージョンはユーザーに影響を与えません。回答は分析されます。
Q: POST/PUTは影にできますか?
A:はい、副作用の分離(スタブ)およびidempotenceが保証されれば。多くの場合、GETから開始し、展開します。
Q:項目の順序が固定されていない場合、応答を比較するにはどうすればよいですか?
A:セットとして/キーによって比較するか、または比較する前に安定したキーによって並べ替えて下さい。
Q:データベースレプリカの遅延について教えてください?
A:「比較ウィンドウ」と参照ブックスナップショットを入力します。ウォールアワーではなくバージョンごとに結果を集計します。
14)合計
シャドウトラフィックは「生産の痛みのないリハーサル」です。実際の負荷、ユーザーのリスクゼロ、不一致の詳細な分析。成功は、分離、正しいサンプリング、品質コンパレータ、および観測可能性によって決定されます。提案された計画に従って、あなたは自信を持ってカナリア/ブルーグリーンのリリースへの道を橋渡しし、建築の進化を加速する再現性のある実践を得るでしょう。