異なるマイクロサービス間の共有ドメインモデル


61

2つの異なるマイクロサービスのシナリオを想像してください。1つはサービス内で認証を処理し、もう1つはユーザー管理を処理します。どちらもユーザーの概念を持ち、お互いの呼び出しを通じてユーザーについて話します。

「ユーザー」のドメインモデルはどこに属しますか?それらは両方とも、ユーザーがデータベースのレベルで何であるかの異なる表現を持っていますか?API呼び出しで使用するUserDTOがある場合、両方ともそれぞれのAPIに1つありますか?

この種のアーキテクチャの問題に対して一般的に受け入れられているソリューションは何ですか?

回答:


36

Microservicesアーキテクチャでは、それぞれが完全に独立しており、内部実装の詳細を隠す必要があります。

モデルを共有すると、マイクロサービスを結合し、各チームが制限なしにマイクロサービスを開発でき、他のマイクロサービスをどのように進化させるかを知る必要があるという最大の利点の1つを失います。各言語で異なる言語を使用することもできることに注意してください。マイクロサービスを結合し始めると、これは困難になるでしょう。

それらがあまりにも関連している場合は、@ soruが言うように実際には1つです。

関連する質問:


21
私は完全に同意することはできません、それらが完全に独立している場合、あなたは2つのモノリスを持っています。アイデアは、スマートエンドポイントとダムパイプを使用することです。エンタープライズコンテキストでは、暗黙の共通ドメインモデルが存在するため(現時点では予測できなかったために暗黙的)、各サービスが車輪の%を再発明しているため、最終的に(現在は悪夢です)壁にぶつかります。そして、マイクロサービスのエコシステムは成長しており、機能とチームの所有権に100%重点を置き、ドメインモデルを台無しにしています。新しいサービスを作成し、他のサービスを消費し、多くの努力を重ねるチームがあります。未解決。
juanmf

5
また、非常に重要なアーキテクチャの重要な非機能要件であるパフォーマンスも無視しました。他のサービスの出力を必要とするこれらのサービスは、各クライアントRQのマルチレベル通信アプローチを提供します。大幅なリファクタリングと、場合によってはマイクロサービスのマージが行われない限り、対処できない遅延を追加します。
juanmf

3
さらに、ドメインモデルを一般的に理解していないため、チームは不要な「アンマーシャリング+オブジェクト-オブジェクト変換」を適用して、呼び出し元のマイクロサービスが採用したモデルにマイクロサービス応答を適合させました。すべてのサービスを共通のドメインモデルライブラリに結合すると、他の運用上の問題が発生する可能性があることは知っていますが、どちらのオプションも満足できるものではありません。
juanmf

3
@juanmfあなたの問題について質問を投稿できれば、非常に価値があります。私もこの問題に関する意見を聞くことに興味があります...
ミロスMrdovic

1
私は座って、理にかなっている何かを書きます
-juanmf

13

2つのサービスが十分に絡み合っており、DTOや他のモデルオブジェクトを共有せずにそれらを実装するのが苦痛になる場合は、2つのサービスを使用すべきではないという強い兆候です。

確かに、この例は2つのサービスとしてほとんど意味がありません。「ユーザー管理」の仕様が非常に複雑であるため、チーム全体が認証を行う時間がないほど忙しくなりすぎると想像するのは困難です。

何らかの理由でそれらが存在する場合、OAuth 2.0のように、基本的に任意の文字列を使用して通信します


4

それらは、2つの別個の境界コンテキスト(ドメイン駆動設計用語)として考えることができます。認証コンテキストの「ユーザー」を他のコンテキストの「ユーザー」と相関させるために使用されるIDを除き、両者間でデータを共有しないでください。彼らはそれぞれ、「ユーザー」が何であるかの独自の表現と、ビジネス責任を実行するために必要な情報だけである独自のドメインモデルを持つことができます。

ドメインモデルは実世界の「もの」をモデル化しようとするのではなく、特定のコンテキスト(Identity / Authorization Management、Human Resourcesなど)にあるものをモデル化することを忘れないでください。


2

どちらもユーザーの概念を持ち、お互いの呼び出しを通じてユーザーについて話します。

@soruが言ったことにも同意します。あるサービスが別のサービスのデータを必要とする場合、それらの境界は間違っています。

素晴らしい解決策は、@ pnschofieldが思いついたことです-サービスを境界付きコンテキストとして扱うことです。

主題について話すと、簡単に言えば、共有ドメインモデルはサービスの自律性を破壊し、マイクロサービスシステムを分散モノリスに変えます。これは明らかにモノリスよりもさらに悪いです。

したがって、未解決の一般的な疑問が残っています。サービスまたはコンテキストの境界を定義する方法です。それにより、高い凝集力と疎結合の良さで繁栄します。

コンテキストをビジネス能力として扱うためのソリューションを思いつきました。より高いレベルのビジネス責任、ビジネス機能であり、全体的なビジネス目標に貢献します。これらは、組織がビジネス価値を得るために歩く必要があるステップと考えることができます。

サービスの境界を識別するときに行う典型的な一連の手順は次のとおりです。

  1. より高いレベルのビジネス機能を特定します。通常、それらは同じドメインの組織間で類似しています。Porterのバリューチェーンモデルをチェックアウトするように見えます。
  2. 各機能内で、さらに掘り下げてサブ機能を特定します。
  3. 機能間の通信に注意してください。組織が行うことを見てください。通常、コミュニケーションは能力の範囲内に集中し、残りの作業の結果を通知します。そのため、技術アーキテクチャを実装する場合、サービスもイベントを介して通信する必要があります。これには複数の肯定的な結果があります。このアプローチを使用すると、サービスは自律的でまとまりがあります。同期通信と分散トランザクションは必要ありません。

おそらく、このテクニックのはあなたにとって興味があるでしょう。このアプローチは非常に有益であることがわかったので、遠慮なくあなたの意見をお聞かせください。確かにそれはあなたのためにうまくいくことができます。


1

マイクロサービスとは「何も共有しない」ことではなく、「可能な限り共有しないこと」です。ほとんどの場合、「ユーザー」は本当に一般的なエンティティです(ユーザーが何らかの共有識別子(userId / email / phone)によって識別されるという理由だけで)。定義により共有されるこの種のエンティティ。ユーザーモデルは、1つのマイクロサービスの範囲外です。そのため、User(最も一般的なフィールド)を配置するグローバルスキーマが必要です。厳密な場合、idのみです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.