アンチパターン: 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 プロキシ内の特定のバックエンド サービスに対し、キープアライブの動作を制御しています。すべてのプロキシ内のすべてのバックエンド サービスに対し、キープアライブの動作を制御するプロパティもあります。Message Processor コンポーネント内で構成可能な HTTPTransport.keepalive.timeout.millis プロパティです。このプロパティのデフォルト値も 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 はバックエンド サービスとの永続接続、非永続接続の両方を自動的に処理できます。

関連情報