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

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する

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 で自動的に処理できるようになります。

関連情報