Короткий ответ
Единого универсального рецепта нет: решение обычно строится вокруг явного версионирования API, длительного периода параллельной поддержки старой и новой версии и измеримых критериев (доля трафика на старой версии, контакты с интеграторами) для принятия решения об отключении старой версии.
Как это работает подробнее
При большом числе независимых внешних потребителей невозможно синхронно обновить всех клиентов, поэтому несовместимое изменение почти всегда требует либо версии в URL/заголовке (/v2/resources), либо расширяемого формата, допускающего постепенный переход (например, поддержка обоих форматов идентификатора одновременно с флагом). Сам факт версионирования не решает проблему — нужен ещё процесс коммуникации с интеграторами и мониторинг перехода.
Пример кода
example.txt
Пример плана эволюции:
1. Выпуск /v2/users с новым форматом id (UUID вместо числового).
/v1/users продолжает работать без изменений минимум 6 месяцев.
2. Метрика перехода: % запросов на /v1 от общего трафика, отслеживается еженедельно.
3. Рассылка интеграторам с датой окончания поддержки /v1 и примерами миграции.
4. Отключение /v1 только после падения трафика на /v1 ниже 1% и индивидуального
контакта с оставшимися активными клиентами.Что использовать на практике
- Практика. Решение зависит от того, насколько критичен сервис для интеграторов, сколько их и насколько активно они поддерживают свою интеграцию: для десятка хорошо известных партнёров может подойти индивидуальная коммуникация и согласованные сроки, а для сотен анонимных потребителей через публичный API — только автоматическое версионирование с длительным сроком поддержки (месяцы) и мониторингом использования старой версии по заголовкам/User-Agent.
Подводные камни
- Риски. Частая ошибка — выключить старую версию по внутреннему дедлайну, не проверив реальную долю трафика, которая на неё приходится, что ломает интеграции без предупреждения. Другая ошибка — поддерживать старые версии бесконечно без плана отключения, из-за чего растёт стоимость поддержки нескольких параллельных контрактов и тормозится развитие API.