web-dev-qa-db-ja.com

複数のマイクロサービスからデータをクエリする方法

マイクロサービスアーキテクチャアプリケーションがあります。サービスの1つには、すべてのユーザー関連情報が含まれています。別のサービスには、ビジネスオブジェクトのセットが含まれています。 Angular UIは、user-serviceおよびbusiness-serviceのREST APIを呼び出して、ユーザー管理、ビジネス管理などの操作を実行します。business-serviceのテーブルには、所有者などのuser-serviceからのユーザーIDが含まれていますこれらは異なるデータベースであるため、参照制約はありません。

UIにビジネスオブジェクトのリストを表示したい。所有者の名で結果をフィルタリングできるようにしたい。ビジネスサービスは、ユーザーID以外のユーザーの詳細を認識しないことに注意してください。

複数のサービスに属するデータを照会する最良の方法は何ですか?

いくつかのオプションを念頭に置いて

  • 冗長データをビジネスサービスに保存しますが、同期が取れなくなる可能性があります。ユーザーサービスとの同期を維持するためにcronジョブを実行する必要がある場合があります。しかし、解決策は醜いです。
  • まず、ユーザーの名と一致するユーザーIDのリストを取得します。これらのIDをビジネスサービスに渡して、フィルタリングを実行することでビジネスオブジェクトのリストを取得します。

どちらのソリューションもクリーンではないようです...

3
TechCrunch

私は通常、各フロントエンドアプリのニーズに対応するための専用のサービスを持っています。このサービスは、フロントエンドに代わってバックエンドを持ち上げます。これにはいくつかの長所があります。

  • UIで最も簡単に使用できるようにデータをフォーマットします。 UIによって要件は異なります。たとえば、Androidアプリを持っている場合、このアプリのフロントエンドサービスを選択して、Jsonへの代替シリアル化形式を使用することができます。これは、デバイスの帯域幅が制限されており、プロトコルが小さいためです。
  • フロントエンドが必要とするデータのフォーマットをバックエンドから切り離します-サービスの1つでJson構造を変更する場合は、フロントエンドサービスでアダプターパターンを使用できます。
  • フロントエンドからバックエンドへの単一のアクセスポイント-ここでアクセスを制御し、たとえばドメインを制限できます。
  • リクエストを効率的に結合します。フロントエンドがバックエンドに送信するリクエストをできるだけ少なくするべきではありませんが、UIはいくつかの異なるサービスからのデータを少し要求することがあります。フロントエンドサービスはこのロジックに適した場所であり、複数のリクエストをより効率的に行うことができます。

まず、ユーザーの名に一致するユーザーIDのリストを取得します。これらのIDをビジネスサービスに渡して、フィルタリングを実行することでビジネスオブジェクトのリストを取得します。

このアプローチをお勧めします。 「フロントエンドサービス」にユーザーサービスにリクエストを送信してすべてのユーザーを名前で取得し、IDを抽出して、ビジネスサービスにリクエストを送信してユーザーIDでビジネスオブジェクトを取得します。これらの2つの要求を容易にするために、サービスにエンドポイントを実装する必要があります。 nリクエストを行っている場合、それは間違っています。

3
Samuel