4

通常、モノリシックなアプリケーションまたはデータ モデルがある場合、異なるテーブルを結合する SQL を作成し、それらにフィルターを適用できます。次に、結果セットを取得したら、そのデータもページングできます。ただし、マイクロサービス アーキテクチャを使用している場合、データ モデルが異なる可能性があります。ネットフリックスは実際に、すべてのテーブルをマイクロサービスとして公開する極端な方法を採用していると聞きました。この場合、ページングとフィルタリングをどのように処理できますか?

アグリゲーションレイヤーとして機能するAPIゲートウェイパターンを使用していることは知っています(おそらく、これがRxJavaのようなプロジェクトの出番です)。マイクロサービスを使用している方や、この問題に取り組んでいる方からアイデアをいただければ幸いです。

4

1 に答える 1

0

テーブルが1つしかない場合でも、ページネーションとフィルタリングは実行可能ですよね?

ですから、問題はマイクロサービス間のテーブルを結合する方法だと思います。

マイクロサービスを使用する人は、マイクロサービス間のテーブルの結合をできるだけ避けると思います。できない場合は、テーブルを異なるマイクロサービスに分割するべきではありません。

一方、目標を達成するためにテーブルを結合する必要がない場合もあります。たとえば、次の 2 つのテーブルがあるとします。

-- from hotel information service
create table t_hotel (
    id VARCHAR(40) not null,
    name varchar(50) not null,
    location varchar(50) not null,
    CONSTRAINT pk_hotel PRIMARY KEY (id)
);

-- from hotel comment service
create table t_hotel_comment (
    id VARCHAR(40) not null,
    hotel_id varchar(40) not null,
    content varchar(50) not null,
    CONSTRAINT pk_hotel_comment PRIMARY KEY (id)
);

ここで、ホテル リストを表示するページを実装する必要があります。各行にコメント数が表示されます。

 ____________________________
| name | location | comments |
| foo  | foooooo  |        2 |
| bar  | barrrrr  |        3 |
 ----------------------------

結合クエリまたは 2 つの API 呼び出しを使用して実装することをお勧めします。

  1. ホテル情報サービスに電話して、ホテルを一覧表示します。
  2. ホテルごとに、ホテル コメント サービスに電話してコメントを集計します。

N+1 のパフォーマンスの問題について懸念がある場合は、コメント数を t_hotel にキャッシュすることができます。

-- from hotel information service
create table t_hotel (
    id VARCHAR(40) not null,
    name varchar(50) not null,
    location varchar(50) not null,
    comments numeric not null,
    CONSTRAINT pk_hotel PRIMARY KEY (id)
);

ホテル コメント サービスは、コメントを受け取るたびに、HotelCommentedEvent を発行します。

HotelCommentedEvent {
    "comment_id": "id",
    "hotel_id": "foo",
    "content": "bar"
}

また、ホテル情報サービスは、このイベントでキャッシュを更新します。したがって、単一のテーブル クエリでこの機能を実装できます。

于 2015-10-23T15:25:39.643 に答える