Вопрос проверяет знание различных подходов к загрузке больших объемов данных с сервера, что критично для производительности веб-приложений.
Пагинация и потоковая передача — это способы загрузки больших наборов данных с сервера частями, чтобы избежать перегрузки сети и клиента. Выбор стратегии зависит от требований к производительности, консистентности данных и пользовательского опыта.
Самый простой подход: клиент передает параметры offset (смещение) и limit (количество записей). Сервер выполняет SQL-запрос с LIMIT и OFFSET.
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;Плюсы: простота реализации. Минусы: при больших смещениях база данных сканирует все строки до offset, что медленно; данные могут дублироваться или пропадать, если между запросами происходят вставки/удаления.
Использует уникальный идентификатор (например, id или timestamp) для указания следующей страницы. Клиент передает значение курсора последнего элемента.
SELECT * FROM users WHERE id > last_seen_id ORDER BY id LIMIT 10;Плюсы: высокая производительность (использует индекс), стабильность при изменении данных. Минусы: сложнее реализовать, не поддерживает произвольный переход на страницу.
Похожа на cursor-based, но использует несколько полей для сортировки. Например, по дате и id.
SELECT * FROM orders WHERE (created_at, id) > ('2023-01-01', 100) ORDER BY created_at, id LIMIT 10;Эффективна для сложных сортировок, но требует составного индекса.
Данные передаются непрерывно по мере готовности. Используется для реального времени: WebSockets, Server-Sent Events (SSE), gRPC streaming. Пример на Node.js с SSE:
app.get('/stream', (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/event-stream' });
setInterval(() => {
res.write(`data: ${JSON.stringify({ time: new Date() })}\n\n`);
}, 1000);
});Плюсы: низкая задержка, подходит для лент новостей или чатов. Минусы: требует постоянного соединения, сложнее в масштабировании.
Для статических списков (например, каталог товаров) лучше использовать cursor-based пагинацию. Для динамических данных в реальном времени (уведомления, котировки) — потоковую передачу. Offset-пагинация подходит только для простых случаев с небольшими объемами данных.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию