アンチパターン: カスタムコードを使用するか、ターゲットとしてプロキシ内でプロキシを呼び出す

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントはこちらをご覧ください。

Apigee では、ある API プロキシから別の API プロキシを呼び出すことができます。この機能は、API プロキシに他の API プロキシで再利用可能なコードが含まれている場合に利用できます。

アンチパターン

ターゲット エンドポイントで HTTPTargetConnection を使用するか、カスタム JavaScript コードを使用して、ある API プロキシから別の API プロキシを呼び出すと、余分なネットワーク ホップが生じます。

HTTPTargetConnection を使用してプロキシ 1 からプロキシ 2 を呼び出す

次のコードサンプルは、HTTPTargetConnection を使用してプロキシ 1 からプロキシ 2 を呼び出します。

<!-- /antipatterns/examples/2-1.xml -->
<HTTPTargetConnection>
  <URL>https://api-test.example.com/proxy2</URL>
</HTTPTargetConnection>

JavaScript コードを使用してプロキシ 1 からプロキシ 2 を呼び出す

次のコードサンプルは、JavaScript を使用してプロキシ 1 からプロキシ 2 を呼び出します。

<!-- /antipatterns/examples/2-2.xml -->
var response = httpClient.send('https://api-test.example.com/proxy2);
response.waitForComplete();

コードフロー

この方法に本質的な欠点があることを理解するには、リクエストが送信されるルートを理解する必要があります。次の図を参照してください。

1)クライアントがプロキシ 1 にリクエストを送信、2)プロキシ 1 からプロキシ 2 へのリクエストでネットワーク ホップが発生、3)プロキシ 2 からターゲットにリクエストを送信。
図 1: コードフロー

図のように、リクエストは Router と Message Processor を含む複数の分散コンポーネントを経由します。

上記のコードサンプルでプロキシ 1 からプロキシ 2 を呼び出す場合、リクエストは実行時に従来のルート(Router から MP へ)を経由することになります。これにより、クライアントから API を呼び出す場合と同様に複数のネットワーク ホップが生じ、レイテンシの増加につながります。プロキシ 1 のリクエストが MP にすでに到達したことを考慮すると、このホップは不要です。

影響

ある API プロキシから別の API プロキシを呼び出すと、不要なネットワーク ホップが生じ、リクエストが 1 つの Message Processor から別の Message Processor に渡されることになります。

ベスト プラクティス

  • ある API プロキシから別の API プロキシを呼び出す場合に、プロキシ チェーン機能を使用します。プロキシ チェーンはローカル接続を使用してターゲット エンドポイント(別の API プロキシ)を参照するため、より効率的です。

    このコードサンプルは、エンドポイント定義で LocalTargetConnection を使用したプロキシ チェーンを示しています。

    <!-- /antipatterns/examples/2-3.xml -->
    <LocalTargetConnection>
      <APIProxy>proxy2</APIProxy>
      <ProxyEndpoint>default</ProxyEndpoint>
    </LocalTargetConnection>

    呼び出された API プロキシは、同じ Message Processor で実行されます。その結果、次の図のようにネットワーク ホップの発生が回避されます。

    1)クライアントがプロキシ 1 にリクエストを送信、2)疑似ローカル呼び出しによってプロキシ 1 からプロキシ 2 にリクエストを送信、3)プロキシ 2 からターゲットにリクエストを送信。
    図 2: プロキシ チェーンのコードフロー

関連情報