Прими к сведению 2

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

Запомни: идеального дизайна нет. Всегда спрашивай: «Какие компромисс я выбираю?». И да, если сомневаешься — посмотри, как это сделано у крупных компаний. Они достаточно часто рассказывают о своем опыте разработки