概要
クライアントが API Gateway を呼び出すと、ゲートウェイは TCP 接続を介してリクエストをバックエンドサービスに中継します。これらの接続に対するタイムアウト設定が不適切な場合、リクエストの失敗や、場合によってはシステム全体の停止を招く可能性があります。このガイドでは、信頼性の高い通信を確保し、潜在的な問題を防ぐための TCP タイムアウトの設定方法を説明します。
HTTP 上の TCP 接続では、一般的に次のタイムアウト設定が使用されます:
-
ConnectionTimeout -
WriteTimeout -
ReadTimeout
ネットワーク状況に基づいて ConnectionTimeout と WriteTimeout を設定してください。パブリックネットワークでの通信では、一般的に長めのタイムアウトが必要です。たとえば、 ConnectionTimeout と WriteTimeout の両方を 10 秒に設定できます。内部ネットワークでの通信では、短めのタイムアウトを使用できます。
一方、 ReadTimeout はバックエンドサービスの処理時間に基づいて設定する必要があります。複数の読み取りタイムアウトが関わるゲートウェイのシナリオでは、特定のルールに従う必要があります。
TCP 接続タイムアウト設定の原則
次の図は、クライアントが API Gateway を呼び出す単純なリクエストパスを示しています。クライアントは API Gateway にリクエストを送信し、API Gateway はそれをバックエンドサービスに転送します。バックエンドサービスがリクエストを処理してレスポンスを返すと、API Gateway はこのレスポンスをクライアントに中継します。

このプロセスでは、次の 2 つのタイムアウト設定が重要です:
-
クライアントが API Gateway からレスポンスを受信するまでのタイムアウト (
ClientReadTimeout)。クライアント側で設定します。 -
API Gateway がバックエンドサービスからレスポンスを受信するまでのタイムアウト (
APIGatewayBackendTimeout)。API Gateway のコンソールで設定します。
図が示すように、
ClientReadTimeout = T2 + T3 + T4 + T5
APIGatewayBackendTimeout = T2 + T3 + T4
そのため、 ClientReadTimeout と APIGatewayBackendTimeout を設定する際は、次の 2 つのルールに従う必要があります:
-
APIGatewayBackendTimeoutは、バックエンドサービスの処理時間より長くする必要があります。 -
ClientReadTimeoutはAPIGatewayBackendTimeoutより長くする必要があります。
たとえば、バックエンドサービスが通常 10 秒未満でリクエストを処理する場合は、 APIGatewayBackendTimeout を 10 秒、 ClientReadTimeout を 15 秒に設定してください。これにより、バックエンドがレスポンスを返すまで TCP 接続が十分な時間維持されます。
これらのルールに従わない場合、バックエンドサービスの処理時間が長いと、API Gateway がレスポンスを送信する前にクライアントが接続を早期に切断してしまう可能性があります。その結果、API Gateway が利用可能な TCP 接続を見つけられず、 N502RE エラーが発生します。トラフィックが多い場合、アバランシェ故障につながる可能性があります。これらの設定には十分注意してください。
設定
API Gateway の APIGatewayBackendTimeout の最小値は 300 ms です。300 ms 未満の値を設定した場合、300 ms が適用されます。
クライアントの HttpClient コネクションプールの初期化コードで ClientReadTimeout を設定します。次の例は、API Gateway SDK を使用して設定する方法を示しています:
public class CommonTest extends ApacheHttpClient {
public final static String HOST = "www.aliyun.com";
static CommonTest instance = new CommonTest();
public static CommonTest getInstance(){return instance;}
public void init(HttpClientBuilderParams httpClientBuilderParams){
httpClientBuilderParams.setScheme(Scheme.HTTP);
httpClientBuilderParams.setHost(HOST);
httpClientBuilderParams.setAppKey("test");
httpClientBuilderParams.setAppSecret("test");
httpClientBuilderParams.setReadTimeout(15000);
super.init(httpClientBuilderParams);
}
}
API のバックエンドサービスを定義する際に、API Gateway のコンソールで APIGatewayBackendTimeout を設定します。
[API バックエンドサービスの定義] ステップで、基本バックエンド定義の [バックエンドタイムアウト] フィールドに目的の値を設定します。デフォルトは 10,000 ms です。
APIGatewayBackendTimeout の優先度
API Gateway のコンソールでは、複数の場所で APIGatewayBackendTimeout を設定できます:
-
バックエンドサービス
-
API バックエンド
-
ルートプラグイン
複数の場所で APIGatewayBackendTimeout を設定した場合、次の優先順位が適用されます:ルートプラグイン > API バックエンド > バックエンドサービス