リプレイ/障害注入を試す(設備の間欠障害)

このサンプルは リプレイ(シナリオ録画→決定論再生)と障害注入を、実機なしで通しで試すためのものです。「現場でしか出ない間欠障害(正常 → 異常 → 無応答)」を録画したシナリオを同梱しているので、録画工程を飛ばして「開く → 再生」からすぐ始められます。

TCP 7100LineFrameシナリオ同梱対話/素モード障害注入実機不要

このページでできること

  • 録画済みシナリオを実機なしで決定論再生し、「正常往復が続いた後に突然の異常 → 無応答」という間欠障害を何度でも同じ形で再現する。
  • 対話モード/素モード再生速度の違いを体感する。
  • 送信に障害(遅延・ロス・切断)を注入し、テスト対象アプリのタイムアウト・リトライ・再接続処理を検証する。
  • 最後に「自分の通信ではどう使うか」を判断フローで掴む。
リプレイ・障害注入の各設定項目の網羅的な説明は リプレイ/障害注入 を参照してください。このページは手順に絞っています。

登場人物(役割)

実機は要りません。CommSim 本体=実機役(録画シナリオを再生)CommSim.Sample=アプリ役(要求を送る)の 2 本だけで完結します。

CommSim.Sampleアプリ役:Read を連投
CommSim 本体実機役:シナリオを再生
⇠ 実機不要
実機使わない
CommSim.Sample で「動かすサンプル=リプレイ(設備の間欠障害)」を選ぶと、アプリ役のポートが自動的に 7100 になり、CommSim 本体(device-replay.commsim=7100 待受)と一致します。ポート番号を手で合わせる必要はありません。

用意するもの

ファイル内容
device-replay/device-replay.commsim実機役スタブのプロジェクト(TCP 7100・LineFrame 構造体定義つき・応答はリプレイで返すためルールは空)
device-replay/scenarios/device-replay.commscenario録画済みシナリオ(正常往復9回 → 異常ステータス → 無応答 → 末尾にテレメトリ)。プロジェクト既定のシナリオ保存先 scenarios/ に同梱(「シナリオを開く」の初期フォルダもここ)
device-replay/device-replay.commsim-structLineFrame 構造体定義のみの可搬ファイル(別プロジェクトへのインポート用)

これらは CommSim.Sample の実行フォルダ内 samples/device-replay/ に同梱されています。実機は不要です。

ステップA:すぐ再生する(まず動かす)

  1. CommSim 本体で samples/device-replay/device-replay.commsim を開く(「ファイル」→「ファイルから開く…」/Ctrl+O)。
  2. セッション「設備スタブ(リプレイ) (TCP 7100)」の「起動」をクリックして待ち受け状態にする。
  3. リプレイ/障害注入」タブ(セッションの 5 番目タブ)を開き、「シナリオを開く」で device-replay.commscenario を選ぶ。シナリオ名「設備の間欠障害(正常→異常→無応答)」とステップ数が表示される。
  4. モード=対話、速度=×5 を選び「再生」を押す(受信待ちの状態になる)。
  5. CommSim.Sample を起動し、上部の「動かすサンプル」で「リプレイ(設備の間欠障害)」を選ぶ。① ペインのポートが 7100 になる。
  6. ① ペインの「起動」(接続)→「デモ送信」を押す。① が Read ch0 を連投し、CommSim 本体が録画通りの応答を返す。
リプレイタブ:シナリオ読込済み(25 ステップ)、モード対話、速度プリセット、再生/停止
「リプレイ」タブ。「シナリオを開く」device-replay.commscenario を読み込むと、ステップ数(25 ステップ・Sequential)が表示される。モード=対話速度(等倍〜即時/×5)を選んで「再生」。次のステップ C で使う障害注入は隣の独立タブにある。

観察できること

  • RXRead 要求(① → 本体)ポーリング
  • TX値 100,101,102… 正常応答正常往復が 8〜9 回続く
  • TX異常ステータス応答★間欠故障の瞬間
  • --(無応答)以降は応答なし。① 側で受信が止まる=タイムアウト
ログペイン:Read 受信ごとに「リプレイ送信」で値が 69→6A→6B→6C と増える正常応答が返り、続いて異常ステータス A5 82 01 0E 36 が返る
再生中のログ。Read 受信(A5 01 01 00 A7)ごとに「リプレイ送信」で録画どおりの応答が返る。値が …69→6A→6B→6C(105→106→107→108)と正常に増えた後、突然 A5 82 01 0E 36(異常ステータス)に切り替わる——これが「正常往復が続いた後の間欠故障」。何度再生しても同じ順序で同じ壊れ方になる(決定論再生)。再生中はヘッダに「リプレイ中」バッジ(停止ボタン付き)が出て、タブヘッダも「自動応答(停止中)」「リプレイ(▶ 実行中)」に変わる。
無応答区間では、CommSim 本体が次の受信を 約 5 秒(ReceiveTimeoutMs)待ってから次へ進みます。一連の流れを目視できたら、速度を「即時」にして再生し直すと、異常箇所まで一瞬で到達でき、デバッグの反復が速くなります。

素モードも見てみる

シナリオ末尾には単方向のテレメトリ(機器 → アプリの周期送信)が入っています。モードを「」に切り替えて再生すると、アプリの要求を待たずにテレメトリだけが時刻順に流れます(センサの周期送出のような一方向通信の再現)。

テレメトリの単方向送出は素モードに切り替えて確認するのが分かりやすいです(対話モードのまま最後まで再生すると、無応答のタイムアウトを経た後に流れます)。

ステップB:自分で録画してみる(実機なし)

同梱シナリオを再生できたら、次は自分でシナリオを作る番です。実機がなくても、CommSim をスタブとして動かし、CommSim.Sample から数往復させて録画できます。

  1. CommSim 本体で新規プロジェクト(または別のスタブセッション)を用意し、応答ルールやオートメーションで「機器役の応答」を設定して起動する。
  2. CommSim.Sample(または任意のクライアント)から数往復ぶんの要求を送る。
  3. CommSim 本体の「ログ」タブに送受信が記録されるのを確認する。
  4. ログペインのツールバーの「シナリオとして保存」をクリックする。
  5. 保存ダイアログで .commscenario として保存する。
  6. 別セッション(または同じセッション)の「リプレイ」タブで「シナリオを開く」→「再生」すると、いま録画した往復が再現される。
実機がある場合は、プロキシ(中継)モードで実機との通信をそのまま記録してシナリオ化できます。詳しくは 中継とキャプチャ を参照してください。

ステップC:障害注入を足す

リプレイに障害注入を重ねると、テスト対象アプリが異常系(タイムアウト・リトライ・再接続)を正しく処理できるかを検証できます。「障害注入」タブ(6番目タブ)で「障害注入を有効にする」をオンにし、値を入れてから再生します。

障害設定は起動中でも変えた時点ですぐ反映されます(再起動は不要)。ただしシードだけは起動中は変更できません——乱数列の途中で種を変えると「同じシードなら同じ壊れ方」という決定論が崩れるためです。シードを変えるときはセッションを停止してください。
障害注入タブ:障害注入を有効にするを ON、ロス率 50、シード 42、遅延 800ms、ゆらぎ 400ms、切断 5 回
「障害注入」タブで有効化して値を入れた状態(例:ロス率 50%・遅延 800ms・ゆらぎ 400ms・切断 5 回・シード 42)。この状態で再生すると、リプレイの応答に障害が上乗せされる。同じシードなら毎回同じ壊れ方(決定論)になる。

設定 → 観察できる症状

障害注入の設定アプリ役(CommSim.Sample)で観察できる症状
遅延 800ms + ゆらぎ 400ms応答が 0.8〜1.2 秒遅れて届く。アプリのタイムアウトが 1 秒未満なら「応答なし」扱いになる
ロス率 50%平均で 2 回に 1 回、応答フレームが届かない(送信に対し受信が欠ける)。リトライ実装の検証に使える
切断(送信 5 回で)5 パケット目の送信直後に接続が切れ、アプリ側に接続断が観測される
シードを変えるロス・ゆらぎの出方が変わる。同じシードなら毎回同じ壊れ方(決定論)=再現と多様性を切り替えられる
  • RXアプリ → CommSim:要求
  • TXCommSim → アプリ:応答(遅延あり)遅延+ゆらぎを付加
  • --(ドロップ)ロス率により送出をスキップ
  • RXアプリ → CommSim:リトライアプリがタイムアウトを検知

自分のケースへの当てはめ方

このサンプルの流れを、自分の通信に応用するときの判断の糸口です。

問いはいいいえ
対象の通信は要求 → 応答型か?対話モード(受信を待って応答を返す)一方向のテレメトリなら素モード(時刻順に送出)
実機が手元にあるか?プロキシで録画(実機との通信をそのまま記録)スタブ+CommSim.Sample(または手動送信)で録画(ステップB)
チェックサム/可変長があるか?先に構造体定義を用意(Sum8 ならこのサンプルの構造体が参考になる)そのまま録画・再生でよい
「実機でしか出ない不具合」を 1 度だけプロキシで録画できれば、以降は実機なしで何度でも同じ条件を再現してデバッグできます。これがリプレイの一番の使いどころです。

次に読む