ope*_*eek 5 paging pagination filtering filter microservices
通常,当您拥有整体应用程序或数据模型时,您可以创建连接不同表的 SQL 并对它们应用过滤器。然后,一旦返回结果集,您也可以对该数据进行分页。但如果您使用微服务架构,数据模型可能会有所不同。我听说 Netflix 实际上将其发挥到了极致,他们将每个表都公开为微服务。在这种情况下如何处理分页和过滤?
我知道他们使用 API 网关模式,可以充当聚合层(可能这就是 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)
);
Run Code Online (Sandbox Code Playgroud)
现在您想要实现一个显示酒店列表的页面,每一行显示其评论数。
____________________________
| name | location | comments |
| foo | foooooo | 2 |
| bar | barrrrr | 3 |
----------------------------
Run Code Online (Sandbox Code Playgroud)
您可能希望使用连接查询或两个 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)
);
Run Code Online (Sandbox Code Playgroud)
每次酒店评论服务收到评论时,都会发布一个 HotelCommentedEvent
HotelCommentedEvent {
"comment_id": "id",
"hotel_id": "foo",
"content": "bar"
}
Run Code Online (Sandbox Code Playgroud)
酒店信息服务会利用此事件更新其缓存。因此,您可以通过单表查询来实现此功能。
| 归档时间: |
|
| 查看次数: |
1800 次 |
| 最近记录: |