4

通常当你有一个单一的应用程序或数据模型时,你可以创建一个连接不同表的 SQL 并对它们应用过滤器。然后,一旦您返回结果集,您也可以分页该数据。但是,如果您使用微服务架构,则数据模型可能会有所不同。我听说 netflix 实际上把它带到了一个极端,他们将每个表都暴露为微服务。在这种情况下如何处理分页和过滤?

我知道他们使用 API Gateway 模式,它可以充当聚合层(可能这就是 RxJava 之类的项目的用武之地)。从使用微服务的人那里获得想法或解决这个问题会很棒。

4

1 回答 1

0

即使只有一张表,分页和过滤也是可行的,对吧?

所以我认为问题是关于如何在微服务之间连接表。

我认为人们使用微服务会尽可能避免在微服务之间加入表。如果他们不能,也许表根本不应该在不同的微服务中分开。

另一方面,有时,您不需要加入表格即可实现目标。例如,假设您有两个表:

-- 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 |
 ----------------------------

您可能希望使用连接查询或两个 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 回答