枯れた技術の地平線:MSXML2.XMLHTTPで叩くネットワーク診断の深淵
世の中はクラウドネイティブやマイクロサービス全盛だが、我々レガシー・エンジニアの戦場は、今なおWindows Serverの片隅、タスクスケジューラに刻まれたVBScriptの鼓動と共に動いている。
「なぜ今さらVBScriptか?」と問う者は、OSの深層心理を知らない。`WScript.Shell`や`MSXML2.XMLHTTP`は、適切に扱えば、現代の巨大なフレームワークをインストールせずとも、数KBのスクリプトでサーバーの死活監視から通信品質の定量化までを完遂する、極めて「高効率な武器」である。
今日は、ネットワークの応答速度とスループットを計測する、実務直結のアーキテクチャを伝授する。
—
1. MSXML2.XMLHTTP を使いこなすための前提
`MSXML2.XMLHTTP`は強力だが、多くのエンジニアが「単にGETして終わり」にしている。ここには、キャッシュの問題やタイムアウトの制御といった、エンタープライズ環境で必須となる「罠」が潜んでいる。
安定した計測のために押さえるべきポイント
- キャッシュの無効化: サーバー側ではなく、ブラウザ/クライアント側のキャッシュを回避するため、クエリ文字列にタイムスタンプを付与する。
- 明示的なオブジェクト破棄: VBScriptのガベージコレクション(GC)は予測不能だ。メモリリークを避けるため、`Set obj = Nothing` を徹底する。
- 非同期通信と同期通信: 診断ツールとしては「同期(False)」で確実にレスポンスを待つのが定石である。
—
2. 極限のネットワーク診断スクリプト:実装例
このスクリプトは、特定のURLへリクエストを投げ、TTFB(Time to First Byte)とダウンロード時間を計測し、CSVへログ出力する。
‘ ネットワーク診断ツール:NetProbe.vbs
Option Explicit
Dim url, startTime, endTime, diffTime, objHTTP, fso, logFile
url = “http://target-server.com/testfile.bin?n=” & Timer ‘ キャッシュ回避
Set objHTTP = CreateObject(“MSXML2.XMLHTTP”)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ログファイル準備
Set logFile = fso.OpenTextFile(“net_log.csv”, 8, True)
On Error Resume Next
‘ 計測開始
startTime = Timer
objHTTP.Open “GET”, url, False
objHTTP.Send
If Err.Number = 0 Then
If objHTTP.Status = 200 Then
endTime = Timer
diffTime = (endTime – startTime) 1000 ‘ ミリ秒換算
‘ ログ記録: 時刻, ステータス, 応答時間(ms), データサイズ(byte)
logFile.WriteLine Now & “,” & objHTTP.Status & “,” & Round(diffTime, 2) & “,” & LenB(objHTTP.ResponseBody)
Else
logFile.WriteLine Now & “,Error,” & objHTTP.Status & “,0”
End If
Else
logFile.WriteLine Now & “,Exception,” & Err.Number & “,0”
End If
‘ オブジェクトの完全解放
‘ ここを怠るエンジニアは、長時間稼働のサーバーでメモリを食いつぶす
Set objHTTP = Nothing
Set fso = Nothing
Set logFile = Nothing
On Error GoTo 0
—
3. シニアアーキテクトからの知見:パフォーマンスの最適化
オブジェクトのライフサイクルを制御せよ
VBScriptの実行環境(WScript.exe)は、実行のたびにメモリ空間を確保する。もし、この計測を1分間隔のループで行うなら、スクリプト内で`Do…Loop`を回し、その中で`objHTTP`を再生成するのではなく、可能な限りオブジェクトの再利用を検討すべきだ。しかし、`XMLHTTP`はリクエストごとのヘッダー汚れを避けるため、長時間の連続使用では一度再インスタンス化するのが「安全な手」となる。
Windows APIの呼び出し(さらなる高みへ)
もしミリ秒単位以上の精度、あるいはパケットロスまで追跡する必要があるなら、`MSXML2.XMLHTTP`の限界を超え、Windowsの`ICMP.dll`を`WMI`経由、あるいは`Declare`文で呼び出す必要がある。しかし、ビジネスの現場では、この`XMLHTTP`によるレイテンシ計測が、最も「運用コストと精度のバランス」が取れている。
レガシー保守の極意
- エラーハンドリング: `On Error Resume Next`は悪ではない。ただし、その後の`Err.Number`チェックを怠ることは罪である。
- タイムアウト設定: 実は`MSXML2.XMLHTTP`には標準のタイムアウト設定が存在しない。より厳密な制御が必要な場合は、`WinHttp.WinHttpRequest.5.1`の使用を強く推奨する。こちらは`SetTimeouts`メソッドにより、接続・送信・受信の各タイムアウトを明示的に指定可能だ。
—
結びに代えて
VBScriptを「古い」と切り捨てるのは簡単だ。しかし、この軽量な言語でインフラの健康状態を監視し、数百のサーバーを管理する環境こそが、真の堅牢なシステムを支えている。
コードを書くとき、常に考えよ。「この処理は、3年後の深夜3時にアラートが鳴った時、メンテナンス担当者が即座に理解できるか?」。
技術とは、最先端を追うことではない。目の前の課題に対し、最も確実で、最も枯れた、最強の解決策を提示することだ。
健闘を祈る。
