2つのマイクロサービス[〜#〜] a [〜#〜]と[〜#〜] b [〜#〜]があります。
すべてのリストを検索したい未構成ユーザー(Set(B)-Set(A))。
serデータが[〜#〜] b [〜#〜]マイクロサービスで大きすぎる場合、どのようにクエリを実行すればよいですか?
これを行う良い方法はありません。データは複数のマイクロサービスに分割されるため、このデータを手動で結合する必要があります。したがって、次のようなコードが必要です。
def find_unconfigured_users():
for user in B.all_users():
if A.has_configured_user(user):
yield user
これは退屈で時間がかかりますが、マイクロサービスを使用しているため、適切な選択肢はありません。 (不合理な選択は、マイクロサービスインターフェイスを経由せずにBのデータに直接アクセスすることです。)
この機能がどこに存在するかは、状況によって異なります。おそらく、これはマイクロサービスA自体の一部、つまり構成済みユーザーを処理するサービスの一部である必要があります。
データがこのように複数のマイクロサービスに分割される場合、これは必要な悪であるか、より深い問題の兆候である可能性があります。ドメイン駆動設計には境界付きコンテキスト –ソフトウェアシステムが解決しようとしている問題ドメインの自己完結型の概念があります。 1つの境界のあるコンテキストを複数のマイクロサービスに分割しないでください。
ユーザーのどの側面がどの境界コンテキストに属しているかを確認したい場合があります。構成されたユーザーと構成されていないユーザーを処理する必要があるのはなぜですか。また、それが一般的なユーザーと異なるのはなぜですか。異なる境界のコンテキストに「ユーザー」の異なるが関連する概念がある場合は正当ですが、それらがどのように関連しているかを明確にする必要があります。ここでは、1つのUserエンティティが異なるコンテキスト間で効果的に共有されているため、問題が発生しているようです。おそらく、解決策は、ユーザーの構成をメインのユーザーコンテキストに含めることです(B)。
「スキーマが固定されている」とは、必ずしもこれを回避するためのgood理由ではありませんが、おそらくあなたの影響は受けません。組織の機能不全、特にマイクロサービスを解決できる技術的ソリューションはありません。次に、上記のコードスニペットのように、退屈な方法ですべてのユーザーをチェックする必要があります。
Userなどのエンティティのプロパティをさまざまなマイクロサービスに格納することは問題ありません(望ましい)。 AがIsConfiguredByAgentなどにのみ関心がある場合、マイクロサービスAがユーザーのすべてのプロパティ(名前、電話番号、電子メールなど)をマイクロサービスBに格納する必要はありません。
設計上の問題は、エージェントによって構成されていないユーザーを知るために、サービスAからサービスBをクエリする必要がないことです。これを行うには、サービスAにもユーザーの完全なセットが必要です。したがって、サービスAとサービスBの両方にユーザーIDの完全なリストがありますが、ユーザーに対して異なるプロパティが格納されています。
ユーザーの作成と削除を許可するために必要なサービスは1つだけです。次に、このサービスは、UserIdを伝達するUserCreatedEventまたはUserRemovedEventを発行し、他のサービスはこれらのイベントをリッスンして、ユーザーの内部リストを更新できます。
イベントを発行するか、アクティブなレコードを使用することにより、aggragate クエリの前を事前計算できます。 agggateの読み取りが簡単-作成する必要があります更新を処理するのベースエンティティを必要とします。これは便利なソリューションです。
ただし、あなたのケースでは、一歩後ろに戻ってデザインを再考する必要があるようです。マイクロサービスまたはテーブルが最適に分割されていない可能性があります。