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

时间:2014-10-23 13:46:09

标签: filter pagination filtering paging microservices

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

我知道他们使用的API网关模式可以作为聚合层(可能这就是RxJava之类的项目进来的地方)。如果人们使用微服务或解决这个问题,那将会很棒。

1 个答案:

答案 0 :(得分: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. 对于每家酒店,请致电酒店评论服务以对评论进行汇总。
  3. 也许您对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"
    }
    

    酒店信息服务通过此活动更新其缓存。因此,您可以使用单个表查询来实现此功能。