web-dev-qa-db-ja.com

同期の代替RESTマイクロサービス間の通信

サービス間の同期通信はアンチパターンであることを知っているので、自分のユースケースに適したソリューションを探しています。

この2つのサービスがあります。

  • Location Serviceユーザーの場所を管理します
  • Score Serviceユーザースコアを管理します

今、私は別のサービスを構築する必要があります:Users Feed Service(UFS)。特定の場所の近くにいるユーザーをスコア順に並べ替える必要があります(降順)。

同期解

  1. ロケーションを指定すると、UFSはロケーションサービス(REST)から近くのユーザーをフェッチします
  2. それらのそれぞれについて、スコアサービス(REST)から彼女のスコアを取得します
  3. 最後に、メモリ内のユーザーを並べ替えて返します

代替は何ですか?私はこのようなことを考えていました:

イベントキューソリューション

  • UFSはユーザーの場所とスコアをデータベース、メモリキャッシュなどに保存します
  • スコアサービスと位置情報サービスがキューに公開されると、キューの変更をリッスンしてデータを更新します

このように、クライアントがユーザーフィードをリクエストすると、ユーザーフィードサービスはネットワークリクエストを実行する必要がありません(必要なデータを所有しています)。

これは良い解決策ですか?どうすれば改善できますか?多くのユーザーに対応できますか?

4
Héctor

これを確認してください: http://microservices.io/patterns/data/event-sourcing.html 。あなたは確かにイベントを扱うことができます。

あなたは確かに次のようにそれを解決するでしょう:

  • 場所はイベントストアにイベントを発行します

  • スコアはイベントストアをリッスンし、イベントを受け取ったら、それを処理して公開します。

1
TanguyB

サービス間の同期通信は、それ自体がアンチパターンではありません。非同期によってさらに複雑になるため、同期ソリューションの方が非同期ソリューションよりも優れている場合があります。

過度におしゃべりなソリューションはかなり悪いです。ロケーションサービスが返したユーザーの数に関係なく、UFSとスコアサービス間のリクエストの量がリクエストごとに一定であると、おそらくより良いでしょう。

ユーザーIDのリスト全体をスコアサービスにUFSに渡して、おそらく降順で並べ替えられた単一の応答を取得します。

プロセス全体がバックグラウンド操作の一部でない限り、おそらく同期通信を使用します。

1
M.A. Hanin