PowerShell で連続的な HTTP リクエストを送る

一定間隔で HTTP リクエストを投げるサンプル。非同期で投げるので、レスポンスによらず一定間隔で投げ続ける。 大量のバースト的なリクエストには向いてない。 各リクエストの結果とレスポンスタイムは最後にまとめて出力するが、途中で実行中断すると出ないので、リクエスト回数とリクエスト間隔の設定には注意する。

通常の PowerShell でも実行できるが、PowerShell ISE の使用を推奨。

$maxCount = 10
$waitSeconds = 2

for ($i = 1; $i -le $maxCount; $i++){
    Write-Output($i.ToString() + "/" + $maxCount.ToString())

    Start-Job -ScriptBlock{
        param(
            [string] $param
        )

        $startTime = [DateTime]::Now

        Write-Output("(" + $param + ") " + $startTime.ToString("[MM/dd HH:mm:ss]") + " requesting...")

        $url = "https://example.com/Function1?param=" + $param

        Invoke-RestMethod -Method Get -Uri $url

        $endTime = [DateTime]::Now
        $duration = $endTime - $startTime
        Write-Output("(" + $param + ") " + $endTime.ToString("[MM/dd HH:mm:ss]") + " response time: " + $duration.TotalSeconds.ToString("N2") + " (s)")
    } -ArgumentList $i

    Start-Sleep $waitSeconds
}

While ($runningJobs = Get-Job -State "Running"){
    Write-Output("Still running... (" + $runningJobs.ChildJobs.Count + " jobs)")
    Start-Sleep 5
}

Write-Output "`r`nAll request completed.`r`n"

foreach ($job in Get-Job){
    Receive-Job -Job $job
    Remove-Job -Job $job
    Write-Output ""
}

実行結果例

f:id:poke_dev:20200118020605p:plain