使用微服务架构进行分页或过滤数据有哪些策略可用?

ope*_*eek 5 paging pagination filtering filter microservices

通常,当您拥有整体应用程序或数据模型时,您可以创建连接不同表的 SQL 并对它们应用过滤器。然后,一旦返回结果集,您也可以对该数据进行分页。但如果您使用微服务架构,数据模型可能会有所不同。我听说 Netflix 实际上将其发挥到了极致,他们将每个表都公开为微服务。在这种情况下如何处理分页和过滤?

我知道他们使用 API 网关模式,可以充当聚合层(可能这就是 RxJava 之类的项目的用武之地)。如果能从使用微服务的人那里得到想法或解决这个问题,那就太好了。

Yug*_*hou 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)
);
Run Code Online (Sandbox Code Playgroud)

现在您想要实现一个显示酒店列表的页面,每一行显示其评论数。

 ____________________________
| name | location | comments |
| foo  | foooooo  |        2 |
| bar  | barrrrr  |        3 |
 ----------------------------
Run Code Online (Sandbox Code Playgroud)

您可能希望使用连接查询或两个 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)
);
Run Code Online (Sandbox Code Playgroud)

每次酒店评论服务收到评论时,都会发布一个 HotelCommentedEvent

HotelCommentedEvent {
    "comment_id": "id",
    "hotel_id": "foo",
    "content": "bar"
}
Run Code Online (Sandbox Code Playgroud)

酒店信息服务会利用此事件更新其缓存。因此,您可以通过单表查询来实现此功能。