通常当你有一个单一的应用程序或数据模型时,你可以创建一个连接不同表的 SQL 并对它们应用过滤器。然后,一旦您返回结果集,您也可以分页该数据。但是,如果您使用微服务架构,则数据模型可能会有所不同。我听说 netflix 实际上把它带到了一个极端,他们将每个表都暴露为微服务。在这种情况下如何处理分页和过滤?
我知道他们使用 API Gateway 模式,它可以充当聚合层(可能这就是 RxJava 之类的项目的用武之地)。从使用微服务的人那里获得想法或解决这个问题会很棒。
通常当你有一个单一的应用程序或数据模型时,你可以创建一个连接不同表的 SQL 并对它们应用过滤器。然后,一旦您返回结果集,您也可以分页该数据。但是,如果您使用微服务架构,则数据模型可能会有所不同。我听说 netflix 实际上把它带到了一个极端,他们将每个表都暴露为微服务。在这种情况下如何处理分页和过滤?
我知道他们使用 API Gateway 模式,它可以充当聚合层(可能这就是 RxJava 之类的项目的用武之地)。从使用微服务的人那里获得想法或解决这个问题会很棒。
即使只有一张表,分页和过滤也是可行的,对吧?
所以我认为问题是关于如何在微服务之间连接表。
我认为人们使用微服务会尽可能避免在微服务之间加入表。如果他们不能,也许表根本不应该在不同的微服务中分开。
另一方面,有时,您不需要加入表格即可实现目标。例如,假设您有两个表:
-- 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 调用来实现:
也许你对 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"
}
并且酒店信息服务使用此事件更新其缓存。因此,您可以通过单个表查询来实现此功能。