検索

ホームページ  >  に質問  >  本文

java - 微服务架构下跨服务查询的聚合有什么好的方案?

微服务架构中,每个服务都有自己的独立数据库。
然而现在有个需求,需要生成一张实时的报表,该报表包含两个服务的数据。
如服务A,服务B。B中仅包含A的主键id作为关联。
而此报表的搜索条件包含A服务实体中的字段也包含B服务实体中的字段。

现有方案
1、如果搜索条件中包含A的条件,则先去服务A中搜索,得到所有结果的主键,在服务B中使用where A.id IN (ids) 再次查询
想法:当A.id数量庞大时,这个查询极其缓慢! 而A.id数量庞大的情况很多

2、使用搜索引擎

想法:感觉杀鸡用牛刀

请教各位大牛有更好的方案吗

大家讲道理大家讲道理2769日前2117

全員に返信(4)返信します

  • 迷茫

    迷茫2017-04-18 10:57:55

    下剤

    オンライン ビジネス データ (OLTP) の場合、オプション 1 はマイクロサービスの標準的な実践です。このような関連するクエリをオンラインで頻繁に実行する必要がある場合、それは 2 つのサービス (およびその 2 つのライブラリ) の結合が非常に深刻であることを意味します。では、そもそも、なぜわざわざそれらを分離する必要があるのでしょうか?

    分析レポートの場合、ソリューション 2 は確かに望ましいソリューションです。検索エンジンを使用するのはやりすぎだと感じる場合は、スレーブ データベースでさまざまなレポート分析操作を実行して、オンラインの A データベースと B データベースをリアルタイムで読み取り専用データベースに同期してから試してみるとよいでしょう。読み取り専用データベースでは、JOIN は一度に実行されます。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:57:55

    マイクロサービスの設計原則の 1 つは、ビジネス間に重複がある場合、ビジネスに関係のないサービスを別のサービスに分離することです。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 10:57:55

    実際、この種の問題はマイクロサービスで非常に一般的です。たとえば、独自の 2 つのソリューションに加えて、注文と製品がそれぞれ 2 つのマイクロサービスに属している場合、その注文を照会する必要があります。もです

    1. データの集約をデータウェアハウスに置き、AとBのデータをリアルタイムで別のデータベース(mysqlである必要はなく、Hbaseでもよい)に集約し、データウェアハウスからレポートのデータを取得します

    2. テーブルを設計するとき、いくつかのフィールドを冗長化するのが適切です。あなたが言ったように、AのいくつかのフィールドはBでも予想通り冗長になる可能性があります

    方法 1 には非常に致命的な欠点があります。ページングが関与すると、この方法を採用することは、データの大きさに応じて異なります。方法 1、速度が遅い場合は、さらにいくつかのスレッドを開いて、対応するデータをバッチで取得できます (ID が多すぎる場合は、それらをバッチで取得し、バッチ クエリはタイムアウトと時間を短縮できる効果的なソリューションです)。データの量が大きい場合は、データ ウェアハウスを使用することをお勧めします。データ ウェアハウスを使用する主な利点は、集計テーブルの生成が Binlog を通じて取得できるため、メイン データベースに負担をかけないことです。レポートは依然としてオフライン データのカテゴリに属しているため、実際に注文のようなものにする必要がある場合、クエリは非常にリアルタイムで非常に効率的で、テーブルのステータスを伴い、非常に多くの検索条件があるため、検索エンジンを使用するのが良い選択です
    したがって、実際の状況に応じて方法1と方法3を使用できます

    返事
    0
  • 黄舟

    黄舟2017-04-18 10:57:55

    レポートの生成などの要件をビジネス データベース システムに含めるべきではありません。バックエンドに一連のカワウソ集約ライブラリを作成して、複数のサービスからのデータをリアルタイムで同期できます。その後、この集約ライブラリで必要なことを何でも行うことができます。

    返事
    0
  • キャンセル返事