我有一个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调用,直到满足页面大小,然后才回复。我不喜欢这种做法。
是否有一个通用的做法,一般的经验法则,或者这个架构是一个糟糕的服务设计?
(编辑):另请说明管理偏移值。 如果我们采用某种方法并获得结果集,我该如何管理下一页请求的偏移量?
感谢阅读:)
答案 0 :(得分:1)
您的服务应该处理分页而不是将其从SQL中移除。做这些步骤:
class = C
获取来自S1(SQL数据库)的所有学生。state = X
。所有这些都在调用 S1和S2 的代码中完成。只有它具有构建页面的知识。
答案 1 :(得分:1)
如果没有SQL的分页,可能会导致大型数据库出现性能问题。
可以应用其中的一些解决方案。我假设分页参数(偏移量,页面大小)可以为服务,您的和外部服务配置。
您可以为两种服务实现预取逻辑,假设预取块大小可以是100。
前端可以提供所需的页面大小10.
如果预取的块不会导致前端页面大小为10,则后端应该预取另一个块,直到fronend可以与10个学生一起提供。
这种方法需要在后端使用更多逻辑来计算预取的下一个偏移,但是如果你想要性能和分页解决,你必须付出一些努力。