Пользователь листает ленту и видит один и тот же пост дважды. А кто-то жалуется, что пропускает записи 👇
📦 Задание
Соцсеть, активная лента, новые посты прилетают каждую секунду. Постраничный вывод сделали классически, через LIMIT/OFFSET. На ревью прошло, тесты зелёные (в тестах данные статичные). В проде в часы пик начались жалобы: дубли на стыке страниц и «куда-то делся пост, я его точно видел».
// src/Feed/FeedRepository.php
class FeedRepository
{
public function __construct(private readonly PDO $pdo) {}
public function page(int $page, int $perPage): array
{
$offset = ($page - 1) * $perPage;
$stmt = $this->pdo->prepare(
'SELECT id, author_id, body, created_at
FROM posts
ORDER BY created_at DESC
LIMIT :limit OFFSET :offset'
);
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
🔹 Задачи
— Объяснить, почему на меняющихся данных OFFSET даёт дубли и пропуски между страницами
— Объяснить, почему сортировка только по created_at дополнительно усугубляет проблему
— Переписать на keyset-пагинацию (cursor) так, чтобы вставки/удаления не сдвигали выдачу
Ставьте → 🔥 если нравится формат. Если нет → 🌚
💬 Решения пишите в комменты под спойлер, сравним подходы.