Проектирование API
- URL — это существительные, а не глаголы. Не
, а/createPost+ метод POST/posts - Версионируй API через URL (
) или заголовки. Если deprecated — добавь хедер/v1/postsи дату удаления —Deprecation: trueSunset - Для редактирования —
, для удаления —PUT/PATCHDELETE - Ошибки:
- Это не только 404. Возвращай HTTP-коды (429 — слишком много запросов, 503 — сервис умер)
- Возвращай понятные сообщения: не «Bad Request», а «User is archived. Editing forbidden»
- Логируй ошибки на стороне сервиса, чтобы не гадать, где косяк.
- Пиши документацию так, чтобы даже менеджер понял. Если в Swagger есть
, не называй это «АПИшкой для постов».GET /v1/posts/{id} - Полинг vs Вебсокеты
- Полинг — это когда ты каждые 5 сек спрашиваешь: «Готово?». Вебсокеты — двустороннее общение. Для чатов/стримов — вебсокеты, для фоновых задач — асинхронный полинг + job ID
- «Прямые» вебсокеты — миф. Клиент-клиент без сервера? Нет, это всегда через балансер и API Gateway. Не рисуй стрелочки в обход инфраструктуры — так не бывает
Балансировка нагрузки
- L7 vs L4 — выбирай с умом
- L4 (IP, порт): быстрый, но тупой. Подходит для высоких нагрузок без анализа контента
- L7 (HTTP-хедеры): умный, но медленнее. Используй для кэширования, маршрутизации по URL, rate limiting
- Пример: API Gateway + L7 балансер для разделения логики.
- Rate Limiting — не только на Gateway
- Можно добавить в само приложение (например, в Spring Boot), но чаще ставят на балансер или Gateway
- Делай rate limiting как по всей системе, так и по отдельным API
- «Почему у нас всё падает?» — Load Shedding (сбрасывай неважные запросы при нагрузке)
- Sticky Sessions — если нужна «привязка» клиента к серверу (например, музыка)
- В Api GW конвертируй REST-запросы в gRPC для внутренней коммуникации сервисов (как в Uber).
Пагинация
- Офсет-лимит vs Курсор
- Офсет-лимит: прост в реализации, но убивает БД на больших данных (читает все предыдущие строки). Представь: пользователь листает ленту, а новые посты добавляются — будут дубли
- Курсор: сложнее, зато быстрее и без дублей. Идеален для бесконечной ленты (например, соцсети).
- Для бесконечных лент (типо TikTok) курсоры > пагинации. Пользователь не заметит, если 100500 новых постов добавилось.
Запомни: идеального дизайна нет. Всегда спрашивай: «Какие компромисс я выбираю?». И да, если сомневаешься — посмотри, как это сделано у крупных компаний. Они достаточно часто рассказывают о своем опыте разработки