29

オンライン ストア プロジェクトの次のマイクロ サービスを検討してください。
ユーザー サービスは、ストアのユーザーに関するアカウント データを保持します (名、姓、電子メール アドレスなどを含む)。

購入サービスは、ユーザーの購入に関する詳細を追跡します。

各サービスは、関連するエンティティを表示および管理するための UI を提供します。購入サービスのインデックス ページには、購入品が一覧表示されます。各購入アイテムには、次のフィールドが必要です:
id、購入ユーザーの氏名、購入アイテムのタイトル、および価格。
また、インデックスページの一部として、店長が購入ユーザー名で購入品を検索できる検索ボックスが欲しいです。

Purchase Service が保持していないデータ (ユーザーの氏名など) を取得する方法がわかりません。ユーザー名を購入して検索購入などのより複雑なことをしようとすると、問題はさらに悪化します。

ユーザーの作成時に何らかのイベントをブロードキャストする (そして、関連するユーザー プロパティのみを Purchase Service 側に保存する) ことにより、2 つのサービス間でユーザーを同期することで、明らかにこれを解決できると考えました。私の観点では、それは理想とはほど遠いものです。何百万人ものユーザーがいる場合、これにどのように対処しますか? ユーザーデータを消費する各サービスで何百万ものレコードを作成しますか?

もう 1 つの明らかなオプションは、指定された ID に基づいてユーザーの詳細を返すユーザー サービス エンドで API を公開することです。つまり、購入サービスでページが読み込まれるたびに、適切なユーザー名を取得するためにユーザー サービスを呼び出す必要があります。理想的ではありませんが、私はそれと一緒に暮らすことができます。

ユーザー名に基づく購入検索の実装についてはどうですか? ユーザー サービス エンドでいつでも別の API エンドポイントを公開できます。このエンドポイントはクエリ用語を受け取り、ユーザー サービスでユーザー名に対してテキスト検索を実行し、条件に一致するすべてのユーザーの詳細を返します。購入サービスで、関連する ID を正しい名前にマップし直して、ページに表示します。このアプローチも理想的ではありません。

何か不足していますか?上記を実装するための別のアプローチはありますか?私がこの問題に直面しているという事実は、コードの匂いのようなものでしょうか? 他の解決策を聞きたいです。

4

4 に答える 4

17

これは、マイクロサービスに移行する際の非常に一般的で中心的な質問のようです。それに対する良い答えがあればいいのにと思います:-)

ここで既に言及した提案されたパターンについては、異なる永続化テクノロジである必要があるとは限らないため、Polyglot 永続化ではなくデータ非正規化という用語を使用します。ポイントは、各サービスが独自のデータを処理することです。はい、データの重複があり、通常、サービス間でデータを共有するには何らかのイベント バスが必要です。

もう 1 つのオプションがあります。これは、最初のオプションの一種で、検索自体を別のサービスとして作成します。

したがって、あなたの例では、ユーザーを管理するための User サービスがあります。Purchases サービスは、購入を管理します。それぞれが独自のデータを処理し、必要なデータのみを処理します (つまり、たとえば Purchases サービスでは、実際にはユーザー名は必要なく、ID のみが必要です)。そして、他のサービスによって生成されたデータを使用し、結合されたデータから検索 "ビュー" を作成する 3 つ目のサービス (検索サービス) があります。

于 2015-04-12T21:04:33.920 に答える
0

モジュールを、それらが扱うデータの所有者および管理者として概念化する場合、モデルはそのデータをそのモジュールから他のユーザーに伝達する必要もあります。対照的に、製造プロセスのモジュールは、データを所有および制御することなく、変更データにアクセスできます。

マイクロサービスは、ほとんどのコードと同様に、モジュールがデータをやり取りして処理する分散処理用のアーキテクチャです。Harvard Business Review と McKinsey によるサプライ チェーンの所有メンバーに関する古典的な記事から、私はこのモデルから生じる複雑さを特定し、プログラマーに知っておくべきことを教える記事を書きました: http://www.powersemantics.com/p .html

製造は統合処理のアーキテクチャであり、モジュールはポイントからポイントへデータを渡すことなくデータを処理します。これは、同じメモリ、ファイル、またはデータベース テーブルにアクセスするようにモジュールを構成することで実現できます。私のアーキテクチャは、参照プロパティを介してメモリ上でこれ​​を達成する方法を示しています。

「指定された ID に基づいてユーザーの詳細を取得する API をユーザー サービス エンドで公開する」ことを検討する場合、HBR が「不可逆的な」複雑さと呼ぶものを作成することに注意する必要があります。A->B (分散型) システムを構築しないでください。要件を分離できなかった後で分散化することはできません。生産プロセスの要件はユーザーの指示を表しており、集中管理されたモジュールでは、間違ったユーザーのプロセスを変更することしかできません。つまり、集中型モジュールはユーザー グループを文書化したり、派生製品ユーザーと区別したりしません。

于 2020-04-17T13:29:41.223 に答える