Как реализовать надежную пагинацию в RESTful API, когда набор результатов может меняться?

Я реализую RESTful API, который выставляет заказы как ресурс и поддерживает пагинацию через набор результатов:

GET /orders?start=1&end=30

где заказы для пагинации сортируются по ordered_at timestamp, по убыванию. Это в основном подход #1 из вопроса SO Pagination in a REST web application.

Если пользователь запрашивает вторую страницу заказов (GET /orders?start=31&end=60), сервер просто повторно запрашивает таблицу заказов, снова сортирует по ordered_at DESC и возвращает записи в позициях с 31 по 60.

Проблема, с которой я столкнулся: что произойдет, если набор результатов изменится (например, будет добавлен новый заказ), пока пользователь просматривает записи? В случае добавления нового заказа пользователь увидит старый заказ №30 на первой позиции на второй странице результатов (потому что тот же заказ теперь №31). Хуже того, в случае удаления пользователь увидит старый заказ №32 на первой позиции на второй странице (№31) и вообще не увидит старый заказ №31 (теперь №30).

Я не вижу решения этой проблемы, если каким-то образом не сделать RESTful сервер stateful (urg) или не встроить некоторый интеллект пагинации в каждого клиента... Какие есть устоявшиеся методы решения этой проблемы?

Для полноты картины: мой back-end реализован на Scala/Spray/Squeryl/Postgres; я создаю два front-end клиента, один на backbone.js, а другой на Python Django.

7
задан Community 23 May 2017 в 12:16
поделиться