如何确保分页REST API中的数据完整性?

时间:2013-03-06 10:08:27

标签: rest

我目前正致力于REST API。 API返回的资源预计将是来自数据库的巨大数据(数据库中的数千万行)。在将数据写入HTTP响应时,分页是必须的,以避免大量内存消耗。

如果在客户端请求之间在DB中删除/添加行时,如何确保数据完整性?

例如:

page 1: [ John, Mary, Harry, David, Joe ]
page 2: [ Mike, Don, Alex ]

在客户请求第1页并将其存储在本地(文件/内存)之后,在询问第2页之前,数据将更改为:

page 1: [ John, Mary, Harry, David, **Mike** ]
page 2: [ Don, Alex, **Terry** ]

2 个答案:

答案 0 :(得分:2)

真正的RESTful(因此服务器端无状态)答案是:

  • 要求前五个记录(最后一个是“Joe”),
  • 然后要求五个记录优先[1]到“乔”,
  • 等等。

通过这种策略,您将在第2页获得“Mike”和“Terry”。

[1]他们必须有排序顺序(按字母顺序或其他顺序排列)。

答案 1 :(得分:0)

对此的一个解决方案是返回表示查询结果集的“临时”资源,然后允许客户端使用GET对其进行分页。

例如:

GET /big-query/all-users
Returns: /query-results/12345 

GET /query-results/12345?page=1
Returns: users 1-20

GET /query-results/12345?page=2
Returns: users 21-40

此解决方案的一个明显问题是,对实际用户的更改不会反映在查询结果集中,因此您应该在API文档中明确说明。此外,在一段合理的时间后“结束”结果集以便(a)防止它变得陈旧以及(b)允许你的服务器收获它所持有的人质内存将是很好的。

另一种方法是每次重新发出查询,然后分页到结果集中以找到要返回的正确数据块。这是无状态的,并且不需要像早期想法那样的驱逐策略,但它确实意味着每次都会重新运行查询。其中很重要的是每个分页的结果都尽可能准确。