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

Apigee X のドキュメントが表示されています。
Apigee Edge のドキュメントを参照する。

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

持続的接続

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

Apigee では、バックエンド サービスとの通信に持続的接続を使用します。接続はデフォルトで 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 とすべてのバックエンド サービスの間の keep-alive 接続の動作に影響します。

アンチパターン

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

以下の例では、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 永続接続を優先して処理する必要があります。
  • バックエンド サービスで永続(キープアライブ)接続を処理できる場合は、必ず Connection:keep-alive ヘッダーを付けて応答します。
  • バックエンド サービスで持続的接続を処理できない場合は、Connection:close ヘッダーを付けて応答する必要があります。

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

関連情報