web-dev-qa-db-ja.com

あるマイクロサービスから別のマイクロサービスへのデータ

あるサービスが別のサービスからデータをどのように取得しますか?いくつか例を挙げます。

1)データを共有する必要がある2つのサービスがあるとします:User ServiceおよびOrder ServiceOrder Serviceはほとんどのデータを取得する必要がありますUser Serviceのデータベースはaddressbonus pointsのように値下げしますが、Order Serviceが受け取るユーザーに関するすべての情報はそのuserIdは、ユーザーDBに直接アクセスできません。

2)アプリには、一部の内部コインを基本通貨として使用するユーザーバランスシステムがあります。アプリは、ユーザーがそれらの内部コインを使うことができる購入するためのさまざまな種類のサービスを提供します。ユーザーの要求を満たすサービスは、何らかの形でUser ServiceまたはBalance Service(ユーザーから別のサービスにバランスを分割することが決定された場合)に通知して、コストまたは残高を確認し、不足している場合はエラーを返します。

3)#2シチュエーションのアプリには、事前に決められた価格がないため、タスクが非常に複雑になったため、Analyze Serviceを実行する必要があり、タスクはそのサービスに移動して、タスクの価格を決定します。タスクを処理する必要があります。そうすると、ユーザーの要求を満たすことができるサービスがそれを実行します。

そこで、マイクロサービスアーキテクチャに関する多数の記事を読んだ後、これらについて考えます。

1)いくつかの方法があります。

  • 必要なデータを取得するために、あるサービスから別のサービスに直接同期HTTP要求(遅い、最も重要なのは、サービスが結合され、マイクロサービスアーキテクチャの利点を失う)
  • クライアントアプリは、グローバルストアに必要なすべてのデータを持ち(SPAアプリの場合など)、リクエストでそれらを送信します(ただし、取得したデータが有効かどうかを確認する手段が必要です...)
  • 必要なデータをJWTに保存する(奇妙な..?)

2)ここに、メッセージブローカーが便利な良い例があると思います。実行中のタスクに関するメッセージとその価格とユーザーIDをUser ServiceまたはBalance Serviceに送信すると、コールバックによってユーザーの残高が減少します。

3)再度メッセージブローカー。 Analyze Serviceはメッセージを送信し、バインドされた実行タスクサービスは分析が完了した後にタスクの実行を開始します。このタスクサービスはキューに依存して実行しますAnalyze Serviceはメッセージを送信します。

ここでの解決策についてはわかりませんので、ここで私の質問です。これらの種類の問題に対処する一般的な方法は何ですか?

2
DarkZ

マイクロサービスアーキテクチャでは、サービスの依存関係(およびその追跡を失う)は珍しくありません。また、サービスにはローカルデータがあり、このデータは別のサービスのプライマリIDでキー付けできることが期待されています。たとえば、一部のサービスでは、観察したようにユーザーIDにデータが添付されます。

ドメインの境界を正しく描画したかどうか、およびそれらが大きすぎるか小さすぎる(または同じサービスに同じ場所に配置する必要がある)かどうかを確認する必要があります。

サービス内の別のサービスから特定のオブジェクトを取得する方法を知っているのはよくないことは正しいです。ユーザーサービスの場合は、ユーザーデータが頻繁に必要になる可能性があるため、このようなサービスが必要になる可能性があることを受け入れる必要があります。この場合、層モデルまたは有向グラフモデルを作成する必要があります(誰もがユーザーサービスを使用し、ユーザーサービスは注文サービスを使用しない場合があります...)

オーケストレーターモデルもあります。そのモデルでは、アプリケーションまたはオーケストレーターサービスが必要なすべてのデータをまとめて取得し、処理する場合は引き渡します。したがって、製品、ユーザー、ボーナスポイントなどから読み取り、それらすべてをデータとして注文サービスに渡します。これにより、このデータを取得する方法に関する知識が存在する場所の数が減少します。

副作用(ボーナスポイントのクレジットなど)には、非同期メッセージパッシングメカニズムのメリットがあります。ボーナスポイントのクレジットは注文処理を妨げるものではなく、注文処理はボーナスポイントがクレジットされるまで待つ必要はありません。最終的にボーナスポイントが付与される限り、問題ありません。メッセージ受け渡しサブシステムは、そのサービスがダウンしている場合にメッセージをバッファーに入れ、そのサービスがどこにあるのか、およびそのサービスがどのように動作するのかを呼び出し元から再び削除します。

2
Martin K

2番目と3番目の問題に対するほとんどの解決策が機能すると思います。 HTTPリクエストでサービスにアクセスすることはそれほど問題ではありません。また、必要なデータの選択複製と疎結合サービスの設計について考えることもできます。

0
Agrem Familier