Версионирование и обратная совместимость

↑ 5.1 Проектирование REST API · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Как менять API, у которого уже есть клиенты, не ломая их.

Объяснение

Ключ — эволюция без поломки: добавляйте, не меняйте. Версия нужна только при неизбежном ломающем изменении.

ИзменениеСовместимо?
Новое необязательное поле в ответеда (клиент должен игнорировать неизвестные поля)
Новый необязательный параметр запросада
Новый endpointда
Новое значение enumопасно, если клиент строго валидирует
Удаление/переименование полянет
Изменение типа или семантики полянет
Ужесточение валидациинет

Стратегии: версия в URL (/v2/...), в заголовке или media type, либо «версия по дате» (Stripe: Stripe-Version: 2024-06-20).

Процесс депрекации: объявить → заголовки Deprecation, Sunset → мониторинг использования старой версии → уведомление клиентов → отключение.

Принцип Postel и толерантные клиенты

Клиент игнорирует неизвестные поля, сервер принимает разумное подмножество — это делает расширение безопасным.

Нюансы и подводные камни

  • Версионирование всего API ради одного поля создаёт лишнюю поддержку; рассмотрите расширение.
  • Поддерживайте не более 2–3 версий одновременно.
  • Контрактные тесты (Pact) ловят поломки до релиза.
  • В событиях и очередях версионирование схем (Schema Registry) — отдельная задача.

Практика

  1. Составьте матрицу совместимых и ломающих изменений вашего API.
  2. Введите заголовки Deprecation и Sunset для устаревающего endpoint.
  3. Добавьте метрику использования версий API.

Вопросы с ответами

Связанные темы