Batching Requests в REST API
Введение: одна поездка вместо пяти 🚚
Batching — это как объединить несколько доставок в одну машину.
Если каждый запрос ездит отдельно, растут задержки и нагрузка.
💡 Совет: группируйте запросы, когда клиенту нужно много данных сразу.
✅ Вывод: batching уменьшает сетевые «поездки» и делает API быстрее для клиента.
Если каждый запрос ездит отдельно, растут задержки и нагрузка.
💡 Совет: группируйте запросы, когда клиенту нужно много данных сразу.
✅ Вывод: batching уменьшает сетевые «поездки» и делает API быстрее для клиента.
Проблема → решение
Проблема: клиент делает 5–10 запросов подряд, страница грузится медленно, сеть перегружена.
Решение: один batch‑запрос, где сервер обрабатывает несколько операций за раз.
✅ Вывод: batching снижает latency и количество запросов.
Решение: один batch‑запрос, где сервер обрабатывает несколько операций за раз.
✅ Вывод: batching снижает latency и количество запросов.
Чем помогает и как работает
Batching помогает:
- уменьшить количество сетевых вызовов;
- ускорить загрузку сложных экранов;
- снизить нагрузку на API‑шлюз.
Как это работает:
- Клиент собирает несколько операций в один payload.
- Отправляет POST на batch‑endpoint.
- Сервер выполняет операции по очереди или параллельно.
- Возвращает массив результатов с кодами для каждого под‑запроса.
- Клиент использует ответы без повторных вызовов.
✅ Вывод: batch — это «контейнер» для нескольких запросов.
Ключевые термины (простыми словами)
- Batching (пакетирование) — несколько запросов в одном HTTP‑вызове.
- Batch endpoint — специальный URL, принимающий пачку операций.
- Sub‑request (под‑запрос) — одна операция внутри batch.
- Partial success (частичный успех) — часть операций успешна, часть — нет.
- Correlation id — идентификатор, чтобы связать ответ с запросом.
Самое важное (must‑know)
- Batch не означает «атомарность» — возможен частичный успех.
- Каждый под‑запрос должен иметь свой id.
- В ответе обязателен статус для каждого под‑запроса.
- Лимитируйте размер batch (количество и вес).
- Для повторов используйте идемпотентность.
1. Batch endpoint — точка входа
Назначение: принять несколько операций одним запросом.
Простыми словами: один адрес для группы действий.
Аналогия: окно «одним пакетом» в банке.
Простыми словами: один адрес для группы действий.
Аналогия: окно «одним пакетом» в банке.
Пример:
POST /batchContent-Type: application/json { "requests": [ { "id": "u1", "method": "GET", "path": "/users/1" }, { "id": "o1", "method": "GET", "path": "/orders/5" } ]}🔎 Как это происходит на практике:
- Клиент формирует массив запросов.
- Сервер принимает пакет и валидирует формат.
- Сервер выполняет операции и готовит ответ.
Характеристики:
- ✅ один HTTP‑вызов вместо многих;
- ✅ единый формат;
- ✅ удобно для сложных экранов.
Когда использовать: когда нужны данные из нескольких источников сразу.
✅ Вывод: batch‑endpoint снижает число запросов.
✅ Вывод: batch‑endpoint снижает число запросов.
2. Формат ответа — частичный успех
Назначение: вернуть результат по каждому под‑запросу.
Простыми словами: каждый запрос получает свой ответ.
Аналогия: чек с позицией и статусом для каждого товара.
Простыми словами: каждый запрос получает свой ответ.
Аналогия: чек с позицией и статусом для каждого товара.
Пример:
{ "responses": [ { "id": "u1", "status": 200, "body": { "id": 1 } }, { "id": "o1", "status": 404, "body": { "error": "Not found" } } ]}🔎 Как это происходит на практике:
- Сервер сопоставляет ответ с
id. - Каждый под‑запрос имеет свой статус.
- Клиент обрабатывает успех и ошибки отдельно.
Характеристики:
- ✅ поддерживает частичные ошибки;
- ✅ понятная диагностика;
- ✅ стабильная связь запрос↔ответ.
Когда использовать: всегда при batch‑ответе.
✅ Вывод: batch‑ответ — это массив результатов.
✅ Вывод: batch‑ответ — это массив результатов.
3. Идемпотентность и повторы
Назначение: безопасно повторять запросы.
Простыми словами: повтор не должен создавать дубли.
Аналогия: повторная оплата без второго списания.
Простыми словами: повтор не должен создавать дубли.
Аналогия: повторная оплата без второго списания.
Пример:
POST /batchIdempotency-Key: 8f1a-44c2🔎 Как это происходит на практике:
- Клиент добавляет idempotency‑key для batch или под‑запросов.
- Сервер сохраняет результат выполнения.
- Повтор возвращает тот же ответ.
Характеристики:
- ✅ защищает от дублей;
- ✅ упрощает ретраи;
- ✅ критично для create‑операций.
Когда использовать: при возможных повторах и таймаутах.
✅ Вывод: без идемпотентности batch опасен.
✅ Вывод: без идемпотентности batch опасен.
4. Лимиты и валидация
Назначение: защитить сервер от больших пачек.
Простыми словами: нельзя отправлять «мешок» без ограничений.
Аналогия: лимит веса в почтовом отделении.
Простыми словами: нельзя отправлять «мешок» без ограничений.
Аналогия: лимит веса в почтовом отделении.
Пример:
Максимум: 20 под‑запросов, 1 MB payload🔎 Как это происходит на практике:
- Сервер проверяет размер и количество.
- Слишком большой batch отклоняется.
- Клиент получает понятную ошибку (например, 413).
Характеристики:
- ✅ снижает риск перегрузки;
- ✅ защищает от злоупотреблений;
- ✅ делает поведение предсказуемым.
Когда использовать: всегда для публичных API.
✅ Вывод: лимиты — обязательная защита.
✅ Вывод: лимиты — обязательная защита.
5. Когда batching не нужен
Назначение: не ухудшать UX там, где нужен real‑time.
Простыми словами: иногда лучше отправить один быстрый запрос.
Аналогия: не ждать автобус, если нужно срочно.
Простыми словами: иногда лучше отправить один быстрый запрос.
Аналогия: не ждать автобус, если нужно срочно.
Пример:
Чат, стриминг, лайв‑обновления — без batching🔎 Как это происходит на практике:
- Если нужен моментальный ответ — не batch.
- Для стриминга и real‑time используют отдельные каналы.
- Batch применяют для «пачки» независимых данных.
Характеристики:
- ✅ улучшает UX;
- ✅ избегает лишней задержки;
- ✅ сохраняет простоту API.
Когда использовать: UI‑сценарии с мгновенной реакцией.
✅ Вывод: batching — не универсальный инструмент.
✅ Вывод: batching — не универсальный инструмент.
Сравнение: Batching vs Bulk
| Подход | Что делает | Пример |
|---|---|---|
| Batching | несколько разных запросов | GET /users + GET /orders |
| Bulk | одна операция над многими | PATCH /users (100 шт) |
Сравнение: Batching vs параллельные запросы
| Подход | Плюсы | Минусы |
|---|---|---|
| Параллель | проще на сервере | много сетевых вызовов |
| Batching | меньше запросов | сложнее обработка |
Типичные ошибки
Ошибка 1: Один общий статус на весь batch
❌ Неправильно: 200 «для всех».
✅ Правильно: статус для каждого под‑запроса.
Почему: операции могут завершиться по‑разному.
✅ Правильно: статус для каждого под‑запроса.
Почему: операции могут завершиться по‑разному.
Ошибка 2: Нет id у под‑запросов
❌ Неправильно: ответы без сопоставления.
✅ Правильно: каждому запросу — свой id.
Почему: клиент должен связать ответ с запросом.
✅ Правильно: каждому запросу — свой id.
Почему: клиент должен связать ответ с запросом.
Ошибка 3: Нет лимитов
❌ Неправильно: unlimited batch.
✅ Правильно: лимит размера и количества.
Почему: защита от перегрузки.
✅ Правильно: лимит размера и количества.
Почему: защита от перегрузки.
Ошибка 4: Ретраи без идемпотентности
❌ Неправильно: повтор create без защиты.
✅ Правильно: idempotency‑key.
Почему: иначе появятся дубли.
✅ Правильно: idempotency‑key.
Почему: иначе появятся дубли.
Ошибка 5: Batch для real‑time сценариев
❌ Неправильно: батчить чат.
✅ Правильно: отдельные быстрые запросы/стриминг.
Почему: batching добавляет задержку.
✅ Правильно: отдельные быстрые запросы/стриминг.
Почему: batching добавляет задержку.
Ошибка 6: Ссылки на документацию вместо ссылок в ответе
❌ Неправильно: клиент «угадывает» next шаг.
✅ Правильно: отдавать нужные данные в ответе.
Почему: клиент должен работать без хардкода.
✅ Правильно: отдавать нужные данные в ответе.
Почему: клиент должен работать без хардкода.
Best Practices
- Используйте
requests[]иresponses[]. - Каждому под‑запросу — свой
id. - Отдавайте статус на каждый элемент.
- Лимитируйте размер batch.
- Добавляйте idempotency‑key для повторов.
- Используйте batch только там, где это ускоряет UX.
Часто спрашивают на собеседованиях
- В чём разница batching и bulk?
- Зачем нужен per‑item status?
- Как обрабатывать частичный успех?
- Почему нужен idempotency‑key?
- Когда batching вреден?
✅ Вывод: после лекции понятно, как проектировать batch‑endpoint и ответы.
Заключение
Batching — это способ сократить количество запросов и сделать API быстрее.
✅ Вывод: применяйте batching там, где есть пачка независимых операций.
✅ Вывод: применяйте batching там, где есть пачка независимых операций.