アンチパターン: HTTP の永続的(再利用可能なキープアライブ)接続を無効にする

API プロキシはクライアント アプリケーションのインターフェースとして、バックエンド サービスとの接続に使用されます。Apigee Edge では、次のようないくつもの手段を使用して、API プロキシ経由でバックエンド サービスに接続できます。

永続的な接続

HTTP 永続接続は、HTTP キープアライブまたは HTTP 接続の再利用とも呼ばれます。これは、個々のリクエスト / レスポンスペアに対して新たな接続を開くのではなく、1 つの TCP 接続を使用して、複数の HTTP リクエスト / レスポンスを送受信しようとする概念です。

Apigee Edge では、バックエンド サービスとの通信に永続的な接続を使用します。デフォルトでは、1 つの接続は 60 秒間存続します。つまり、接続プール内の接続のアイドル状態が 60 秒を超えると、この接続は閉じられます。

キープアライブのタイムアウト時間を、keepalive.timeout.millis という名前のプロパティで構成できます。これは API プロキシの TargetEndpoint 構成内で指定されます。たとえば、TargetEndpoint の特定のバックエンド サービスに関して、キープアライブのタイムアウト時間を 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 プロキシ内の特定のバックエンド サービスに関するキープアライブの動作を制御します。また、すべてのプロキシ内のすべてのバックエンド サービスに関するキープアライブの動作を制御するプロパティもあります。HTTPTransport.keepalive.timeout.millis は Message Processor コンポーネント内で構成可能なプロパティです。このプロパティのデフォルト値も 60 秒です。このプロパティに加えた変更は、すべての API プロキシ内で、Apigee Edge と全バックエンド サービスの間のキープアライブ接続の動作に反映されます。

アンチパターン

特定の API プロキシの TargetEndpoint 構成内で keepalive.timeout.millis プロパティを 0 に設定して、または Message Processor で HTTPTransport.keepalive.timeout.millis を 0 に設定して、永続的な(キープアライブ)接続を無効にすることはおすすめできません。パフォーマンスに影響が及ぶためです。

次の例は、TargetEndpoint 構成内で keepalive.timeout.millis を 0 に設定することで、特定のバックエンド サービスとの永続的な(キープアライブ)接続を無効にします。

<!-- /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 つまたは複数のバックエンド サービスに関するキープアライブ接続を無効にした場合、Edge はこのターゲット バックエンド サービスに対する新たなリクエストのたびに、新たな接続を開かなければならなくなります。バックエンドが HTTPS の場合は、新たなリクエストのたびに SSL handshake を実行する必要も生じ、API リクエストの全体的なレイテンシが大きくなります。

影響

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

ベスト プラクティス

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

このパターンを実装することで、API プロキシに変更を加えなくても、Apigee Edge はバックエンド サービスとの永続接続、非永続接続の両方を自動的に処理できます。

関連情報