REST,使用依赖于外部系统的过滤器分页和sql

时间:2016-04-20 12:37:23

标签: rest architecture pagination microservices

我有一个REST Web服务,预计会公开一个分页的GET调用。

例如:我的sql表中有一个学生列表(“Name”,“Age”,“Class”)。我必须公开一个分页API,让所有学生都上课。到现在为止还挺好。只需一个典型的REST api就可以通过sql查询完成工作和分页。

现在假设我们有相同的要求,只需要回送来自特定州的学生。此信息由Web服务S2托管。 S2有一个API,给出学生姓名列表,状态“X”返回属于X的学生。

这是我发现很难支持分页的地方。

例如:我收到了一个带有page_size 10的请求,一个C类和一个状态X,它从我的db中产生了来自C类的10名学生。现在我和这10名学生和州X打电话给S2,作为回报,结果可能包括0名学生,所有10名学生,或者来自州'X'的0到10岁之间的任何数字学生。

在这种情况下,我如何支持分页?

蛮力是进行db调用和S2调用,直到满足页面大小,然后才回复。我不喜欢这种做法。

是否有一个通用的做法,一般的经验法则,或者这个架构是一个糟糕的服务设计?

(编辑):另请说明管理偏移值。 如果我们采用某种方法并获得结果集,我该如何管理下一页请求的偏移量?

感谢阅读:)

2 个答案:

答案 0 :(得分:1)

您的服务应该处理分页而不是将其从SQL中移除。做这些步骤:

  1. class = C获取来自S1(SQL数据库)的所有学生。
  2. 使用结果,让所有来自S2的学生都在state = X
  3. 以稳定的方式对第二个结果进行排序。
  4. 从排序结果中获取所需的页面。
  5. 所有这些都在调用 S1和S2 的代码中完成。只有它具有构建页面的知识。

答案 1 :(得分:1)

如果没有SQL的分页,可能会导致大型数据库出现性能问题。

可以应用其中的一些解决方案。我假设分页参数(偏移量,页面大小)可以为服务,您的和外部服务配置。

您可以为两种服务实现预取逻辑,假设预取块大小可以是100。

前端可以提供所需的页面大小10.

如果预取的块不会导致前端页面大小为10,则后端应该预取另一个块,直到fronend可以与10个学生一起提供。

这种方法需要在后端使用更多逻辑来计算预取的下一个偏移,但是如果你想要性能和分页解决,你必须付出一些努力。