アンチパターン: ターゲットのない API プロキシで Service Callout ポリシーを使用してバックエンド サービスを呼び出す

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

API プロキシは、バックエンド サービス用の管理されたファサードです。基本的な API プロキシ構成は、ProxyEndpoint(API プロキシの URL を定義)と TargetEndpoint(バックエンド サービスの URL を定義)で構成されます。

Apigee は非常に柔軟性が高く、このパターン上に高度な動作を構築できます。たとえば、ポリシーを追加することで、API がクライアント リクエストをバックエンド サービスに送信する前に処理する方法を制御できます。あるいは、クライアントに転送する前にバックエンド サービスから受信したレスポンスを操作できます。Service Callout ポリシーを使用して他のサービスを呼び出せます。また JavaScript コードを追加してカスタム動作を追加できます。バックエンド サービスを呼び出さない API プロキシを作成することもできます。

アンチパターン

サービス コールアウトを使用して、ターゲット エンドポイントへのルートがない API プロキシでバックエンド サービスを呼び出すことは技術的には可能ですが、その結果として、外部サービスのパフォーマンスに関する分析データが失われます。

ターゲット ルートを含まない API プロキシは、リクエスト メッセージを TargetEndpoint に転送する必要がない場合に役立つ可能性があります。代わりに ProxyEndpoint が必要なすべての処理を実行します。たとえば、ProxyEndpoint は、ルックアップから API サービスの Key-Value ストアへのデータを取得し、バックエンド サービスを呼び出すことなく、レスポンスを返すことができます。

以下のように、API プロキシで null ルートを定義できます。

<RouteRule name="noroute"/>

null ルートを使用するプロキシは、ターゲット バックエンド サービスを呼び出さないので、「ターゲットのない」プロキシとなります。

以下のように、ターゲットのないプロキシにサービス コールアウトを追加して、外部サービスを呼び出すことは技術的に可能です。

<!-- /antipatterns/examples/service-callout-no-target-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Name>ServiceCallout-InvokeBackend</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/no-target-proxy</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="noroute"/>
</ProxyEndpoint>

ただし、プロキシは外部サービスの動作に関する分析情報(処理時間やエラー率など)を提供できないので、外部サービスのパフォーマンスを評価することが困難になります。

影響

  • 外部サービスの操作に関する分析情報(エラーコード、応答時間、ターゲット パフォーマンスなど)を取得できません。
  • サービス コールアウトを呼び出す前または後に必要となる特定のロジックが、プロキシ ロジック全体の一部として組み込まれているので、これを理解して再利用することは容易ではありません。

ベスト プラクティス

API プロキシが単一の外部サービスとのみ対話する場合、そのプロキシは基本設計パターンに従う必要があります。基本設計パターンでは、バックエンド サービスが API プロキシのターゲット エンドポイントとして定義されます。ターゲット エンドポイントへのルーティング ルールのないプロキシでは、バックエンド サービスの呼び出しに ServiceCallout ポリシーを使用しないでください。

次のプロキシ構成は、上記の例と同じ動作を実装していますが、ベスト プラクティスに従っています。

<!-- /antipatterns/examples/service-callout-no-target-2.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request/>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/simple-proxy-with-route-to-backend</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
    </RouteRule>
</ProxyEndpoint>

サービス コールアウトを使用することで、ターゲット エンドポイントの呼び出し前または後に外部サービスを呼び出すというマッシュアップ シナリオを可能にします。サービス コールアウトは、ターゲット エンドポイントの呼び出しに代わるものではありません。

関連情報