あるサービスが別のサービスからデータをどのように取得しますか?いくつか例を挙げます。
1)データを共有する必要がある2つのサービスがあるとします:User Service
およびOrder Service
。 Order Service
はほとんどのデータを取得する必要がありますUser Service
のデータベースはaddress
、bonus points
のように値下げしますが、Order Service
が受け取るユーザーに関するすべての情報はそのuserId
は、ユーザーDBに直接アクセスできません。
2)アプリには、一部の内部コインを基本通貨として使用するユーザーバランスシステムがあります。アプリは、ユーザーがそれらの内部コインを使うことができる購入するためのさまざまな種類のサービスを提供します。ユーザーの要求を満たすサービスは、何らかの形でUser Service
またはBalance Service
(ユーザーから別のサービスにバランスを分割することが決定された場合)に通知して、コストまたは残高を確認し、不足している場合はエラーを返します。
3)#2シチュエーションのアプリには、事前に決められた価格がないため、タスクが非常に複雑になったため、Analyze Service
を実行する必要があり、タスクはそのサービスに移動して、タスクの価格を決定します。タスクを処理する必要があります。そうすると、ユーザーの要求を満たすことができるサービスがそれを実行します。
そこで、マイクロサービスアーキテクチャに関する多数の記事を読んだ後、これらについて考えます。
1)いくつかの方法があります。
2)ここに、メッセージブローカーが便利な良い例があると思います。実行中のタスクに関するメッセージとその価格とユーザーIDをUser Service
またはBalance Service
に送信すると、コールバックによってユーザーの残高が減少します。
3)再度メッセージブローカー。 Analyze Service
はメッセージを送信し、バインドされた実行タスクサービスは分析が完了した後にタスクの実行を開始します。このタスクサービスはキューに依存して実行しますAnalyze Service
はメッセージを送信します。
ここでの解決策についてはわかりませんので、ここで私の質問です。これらの種類の問題に対処する一般的な方法は何ですか?
マイクロサービスアーキテクチャでは、サービスの依存関係(およびその追跡を失う)は珍しくありません。また、サービスにはローカルデータがあり、このデータは別のサービスのプライマリIDでキー付けできることが期待されています。たとえば、一部のサービスでは、観察したようにユーザーIDにデータが添付されます。
ドメインの境界を正しく描画したかどうか、およびそれらが大きすぎるか小さすぎる(または同じサービスに同じ場所に配置する必要がある)かどうかを確認する必要があります。
サービス内の別のサービスから特定のオブジェクトを取得する方法を知っているのはよくないことは正しいです。ユーザーサービスの場合は、ユーザーデータが頻繁に必要になる可能性があるため、このようなサービスが必要になる可能性があることを受け入れる必要があります。この場合、層モデルまたは有向グラフモデルを作成する必要があります(誰もがユーザーサービスを使用し、ユーザーサービスは注文サービスを使用しない場合があります...)
オーケストレーターモデルもあります。そのモデルでは、アプリケーションまたはオーケストレーターサービスが必要なすべてのデータをまとめて取得し、処理する場合は引き渡します。したがって、製品、ユーザー、ボーナスポイントなどから読み取り、それらすべてをデータとして注文サービスに渡します。これにより、このデータを取得する方法に関する知識が存在する場所の数が減少します。
副作用(ボーナスポイントのクレジットなど)には、非同期メッセージパッシングメカニズムのメリットがあります。ボーナスポイントのクレジットは注文処理を妨げるものではなく、注文処理はボーナスポイントがクレジットされるまで待つ必要はありません。最終的にボーナスポイントが付与される限り、問題ありません。メッセージ受け渡しサブシステムは、そのサービスがダウンしている場合にメッセージをバッファーに入れ、そのサービスがどこにあるのか、およびそのサービスがどのように動作するのかを呼び出し元から再び削除します。
2番目と3番目の問題に対するほとんどの解決策が機能すると思います。 HTTPリクエストでサービスにアクセスすることはそれほど問題ではありません。また、必要なデータの選択複製と疎結合サービスの設計について考えることもできます。