アンチパターン: HTTP の持続的(再利用可能な keep-alive)接続を無効にする

API プロキシは、バックエンド サービスとの接続に使用されるクライアント アプリケーション用のインターフェースです。 Apigee で API プロキシを介してバックエンド サービスに接続する方法は複数あります。

持続的接続

HTTP の持続的接続は HTTP keep-alive や HTTP 接続の再利用とも呼ばれ、リクエスト / レスポンスごとに新しい接続を開くのではなく、単一の TCP 接続で複数の HTTP リクエスト / レスポンスを送受信できます。

Apigee では、バックエンド サービスとの通信に持続的接続を使用します。接続はデフォルトで 60 秒間持続します。 つまり、接続プール内の接続のアイドル状態が 60 秒を超えると、接続が終了します。

keep-alive のタイムアウト期間は、keepalive.timeout.millis という名前のプロパティで構成できます。これは API プロキシの TargetEndpoint 構成内で指定されます。たとえば、TargetEndpoint の特定のバックエンド サービスに対し、keep-alive の期間を 30 秒に設定できます。

以下の例では、TargetEndpoint 構成で keepalive.timeout.millis が 30 秒に設定されています。

<!-- /antipatterns/examples/disable-persistent-connections-1.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">30000</Property>
    </Properties>
  </HTTPTargetConnection>Disable HTTP persistent (Reusable keep-alive) connections
</TargetEndpoint>

上記の例では、keepalive.timeout.millis が API プロキシ内の特定のバックエンド サービスに関する keep-alive の動作を制御しています。また、すべてのプロキシ内のすべてのバックエンド サービスに関する keep-alive の動作を制御するプロパティもあります。HTTPTransport.keepalive.timeout.millis は Message Processor コンポーネント内で構成可能なプロパティです。このプロパティのデフォルト値も 60 秒です。このプロパティを変更すると、すべての API プロキシ内で、Apigee とすべてのバックエンド サービスの間の keep-alive 接続の動作に影響します。

アンチパターン

特定の API プロキシの TargetEndpoint 構成で keepalive.timeout.millis プロパティを 0 に設定するか、Message Processor で HTTPTransport.keepalive.timeout.millis を 0 に設定して持続的な(keep-alive)接続を無効にすると、パフォーマンスに影響するため、おすすめしません。

以下の例では、TargetEndpoint 構成で keepalive.timeout.millis を 0 に設定することで、特定のバックエンド サービスに対して持続的な(keep-alive)接続を無効にしています。

<!-- /antipatterns/examples/disable-persistent-connections-2.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">0</Property>
     </Properties>
  </HTTPTargetConnection>
</TargetEndpoint>

1 つ以上のバックエンド サービスに対して keep-alive 接続が無効になっている場合、Apigee でターゲット バックエンド サービスへの新しいリクエストごとに新しい接続を開く必要があります。バックエンドが HTTPS の場合、Apigee で新しいリクエストごとに SSL handshake を実行するため、API リクエストの全体的なレイテンシが増加します。

効果

  • Apigee で新しい接続を開き、新しいリクエストごとに SSL handshake を実行する必要があるため、API リクエストの全体的な応答時間が長くなります。
  • 接続がシステムに解放されるまでに時間がかかるため、トラフィック量が多い場合は新たな接続を確立できなくなる可能性があります。

ベスト プラクティス

  • バックエンド サービスは HTTP 1.1 標準に従い、HTTP の持続的接続を優先して処理する必要があります。
  • バックエンド サービスでは、持続的な(keep-alive)接続を処理できる場合は Connection:keep-alive ヘッダーを付けて応答する必要があります。
  • バックエンド サービスで持続的接続を処理できない場合は、Connection:close ヘッダーを付けて応答する必要があります。

このパターンを実装すると、API プロキシを変更する必要なしに、バックエンド サービスとの持続的接続や持続的でない接続を Apigee で自動的に処理できるようになります。

関連情報