我目前正致力于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** ]
答案 0 :(得分:2)
真正的RESTful(因此服务器端无状态)答案是:
通过这种策略,您将在第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)允许你的服务器收获它所持有的人质内存将是很好的。
另一种方法是每次重新发出查询,然后分页到结果集中以找到要返回的正确数据块。这是无状态的,并且不需要像早期想法那样的驱逐策略,但它确实意味着每次都会重新运行查询。其中很重要的是每个分页的结果都尽可能准确。