APIをホストするサーバーが高負荷の状態にあるときにのみ、スロットリングはめったに発生しないため、そのテストは困難です。 開発プロキシを使用すると、任意の API で調整をシミュレートし、アプリケーションが正しく処理するかどうかを確認できます。
任意の API でスロットリングをシミュレートするには、GenericRandomErrorPlugin を使用します。 使用する API が Retry-After
ヘッダーを返す場合は、 RetryAfterPlugin を使用して、API の指示に従ってアプリがバックオフされることを確認します。
任意の API でスロットリングをシミュレートする
開始するには、開発プロキシ構成ファイルで GenericRandomErrorPlugin
を有効にします。
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/rc.schema.json",
"plugins": [
{
"name": "GenericRandomErrorPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll",
"configSection": "errorsContosoApi",
"urlsToWatch": [
"https://api.contoso.com/*"
]
}
]
}
次に、シミュレートするエラーを含むファイルを使用するようにプラグインを構成します。
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/rc.schema.json",
"plugins": [
{
"name": "GenericRandomErrorPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll",
"configSection": "errorsContosoApi",
"urlsToWatch": [
"https://api.contoso.com/*"
]
}
],
"errorsContosoApi": {
"errorsFile": "errors-contoso-api.json"
}
}
エラー ファイルで、API の実際の調整応答と一致するように調整応答を定義します。
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/genericrandomerrorplugin.schema.json",
"errors": [
{
"request": {
"url": "https://api.contoso.com/*"
},
"responses": [
{
"statusCode": 429,
"headers": [
{
"name": "Content-Type",
"value": "application/json"
}
],
"body": {
"code": "TooManyRequests",
"message": "Too many requests"
}
}
]
}
]
}
構成ファイルを使用して開発プロキシを起動し、アプリをテストして、アプリがスロットリングをどのように処理するかを確認します。
Retry-After
ヘッダーを使用して正しいバッキングオフをテストする
多くの API では、 Retry-After
応答ヘッダーを使用して、特定の時間のバックオフをアプリに指示します。 開発プロキシを使用して調整応答をシミュレートする場合は、静的な値に Retry-After
ヘッダーを構成するか、API を再度呼び出す前にアプリが指示どおりに待機しているかどうかをテストする動的値を使用できます。
静的な値にRetry-After
ヘッダーを設定するには、スロットル応答にヘッダーを追加します。
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/genericrandomerrorplugin.schema.json",
"errors": [
{
"request": {
"url": "https://api.contoso.com/*"
},
"responses": [
{
"statusCode": 429,
"headers": [
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Retry-After",
"value": "60"
}
],
"body": {
"code": "TooManyRequests",
"message": "Too many requests"
}
}
]
}
]
}
この例では、 Retry-After
ヘッダーは 60 秒に設定されています。 ヘッダーを静的な値に構成すると、アプリが API を再度呼び出す前に待機しているかどうかを Dev Proxy が制御しません。
アプリが API を再度呼び出す前に正しく待機しているかどうかをテストするには、ヘッダーの値を @dynamic
に変更します。
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/genericrandomerrorplugin.schema.json",
"errors": [
{
"request": {
"url": "https://api.contoso.com/*"
},
"responses": [
{
"statusCode": 429,
"headers": [
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Retry-After",
"value": "@dynamic"
}
],
"body": {
"code": "TooManyRequests",
"message": "Too many requests"
}
}
]
}
]
}
さらに、 RetryAfterPlugin
を使用して開発プロキシ構成を拡張します。
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/rc.schema.json",
"plugins": [
{
"name": "RetryAfterPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll",
"urlsToWatch": [
"https://api.contoso.com/*"
]
},
{
"name": "GenericRandomErrorPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll",
"configSection": "errorsContosoApi",
"urlsToWatch": [
"https://api.contoso.com/*"
]
}
],
"errorsContosoApi": {
"errorsFile": "errors-contoso-api.json"
}
}
注意事項
構成ファイルのRetryAfterPlugin
の前にGenericRandomErrorPlugin
を追加します。 後で追加した場合、GenericRandomErrorPlugin
が処理する前にRetryAfterPlugin
によって要求が失敗します。
このプラグインは、スロットリングの応答を追跡し、引き続きスロットリングされているAPIに対して発行された要求を強制的にエラーを発生させます。
詳細
Dev Proxy