6 ответов

★ Лучший ответ

Какое-то время запускайте обе API параллельно - оставьте REST в рабочем состоянии как есть, а GraphQL выкатывайте как новый endpoint. Дайте клиентам время перейти в своём темпе, может быть год или больше в зависимости от того, сколько их у вас. Хорошо документируйте GraphQL, чтобы миграция казалась естественной, а не навязанной. Как только большинство переведётся, можно постепенно deprecate REST с достаточным сроком предупреждения.

Работать параллельно - это вариант, но главная боль, о которой никто не говорит, в том, что нужно будет синхронизировать слой БД и бизнес-логику для двух разных форм запросов - рано или поздно одна команда начнёт оптимизировать именно под GraphQL, а REST-клиенты будут дёргать один и тот же бэкенд и удивляться, почему они получают таймауты. Чище подойти так: построить GraphQL поверх существующих REST-endpoint'ов как адаптер, и тогда ты вообще не поддерживаешь две отдельные кодовые базы, а просто один слой трансляции, который докажет, что схема работает, прежде чем ты будешь трогать сам бэкенд.

Двойной API имеет смысл, но вот что часто упускают: сначала явно версионируй REST endpoints (типа `/api/v1/`), ещё до того как вводить GraphQL. Это даёт чистое разделение и означает, что когда ты в итоге откажешься от REST, ты не подведёшь тех, кто его ещё использует. Они могут остаться на v1 навсегда, если нужно, и у тебя есть чётко задокументированная траектория deprecation с первого дня.

Проблема синхронизации, которая упоминалась выше, реальная и болезненная. Что помогает - это активное использование внутренних адаптеров или слоя абстракции запросов, по сути посредник, который оба API могут вызывать, так что твоя бизнес-логика остаётся DRY. Если ты строишь GraphQL resolver'ы, которые просто транслируют в те же самые вызовы сервиса, что и REST контроллеры, ты снижаешь шанс того, что они разойдутся и будут возвращать разные данные. Да, в начале больше работы, но это спасает тебя от отладки типа «почему это поле имеет разные значения в GraphQL и REST» через полгода.

Стоит также подумать: какие клиенты для тебя самые важные? Если у тебя 100 внутренних сервисов используют REST API против небольшого количества публичных потребителей, то твоя временная шкала миграции и стратегия коммуникации должны быть совсем разными. Внутренние команды могут двигаться быстрее, и ты можешь реально заставить их мигрировать. Внешним пользователям нужно намного больше уведомлений и терпения.

более серьёзная проблема, которую люди часто пропускают - это то, что ты в итоге будешь поддерживать две полностью отдельные документацию, SDK-и и потоки аутентификации, если не будешь внимателен. это означает, что твоя команда поддержки завалится вопросами о том, какой API использовать, а разработчики выберут неправильный. прежде чем запускать GraphQL, точно определи, как долго REST будет поддерживаться (например, 18 месяцев с жёсткой датой окончания), и коммуницируй это постоянно, потому что именно неопределённость убивает эти миграции. ты планируешь поддерживать паритет функциональности между обоими API во время перехода, или GraphQL получит новые функции первым, чтобы стимулировать переход?

Amy1987 автор вопроса Сначала полное соответствие функциональности, а потом GraphQL-first для новых функций спустя 12 месяцев - это поможет стимулировать миграцию, не раздражая пользователей REST.

Не пытайся делать так, чтобы REST и GraphQL схемы идеально зеркалировали друг друга - вот в чём большинство и ошибаются. Оставляй их намеренно свободными, чтобы GraphQL мог переформатировать запросы так, как удобно клиентам, а твой REST слой оставался стабильным; синхронизируй на уровне данных, а не на уровне API контракта, и ты избежишь большей части кошмара с обслуживанием, который возникает из-за попыток держать два идентичных интерфейса.

Не пытайся заменить REST в один день и не устраивай постепенное устаревание, где ты уже направляешь клиентов на новое, пока старое ещё существует - вот тогда всё ломается, люди путаются, какой endpoint использовать, и в итоге ты всё равно получаешь раздробленную экосистему.

Самый чистый путь - сначала стабилизировать твой REST API. Убедись, что он делает то, что должен, задокументируй его как надо, а потом добавь GraphQL как совершенно отдельный слой обслуживания поверх одних и тех же источников данных. Это значит, что твоя бизнес-логика и база данных не должны ничего знать о форматах API - оба просто обращаются к одной и той же системе. Ты не дублируешь код, ты просто добавляешь ещё один способ его запроса. Это снимает давление с проблемы синхронизации, которая возникает, когда ты пытаешься держать в синхронизме две разные схемы запросов.

Установи реалистичный таймлайн, где оба действительно сосуществуют - может быть, 18 месяцев, может быть, дольше, в зависимости от того, сколько у тебя клиентов. Что действительно важно: держи аутентификацию одинаковой на обоих endpoints, чтобы клиентам не пришлось учить новые паттерны аутентификации, поддерживай понятную документацию для каждого API и не давай ей разойтись, и кто-то (или команда) должны быть ответственны за их согласованность. Это не гламурная работа, но она предотвращает ситуацию, когда служба поддержки завалена вопросами, потому что никто не знает, какой endpoint должен использовать клиент или почему его старый код вдруг перестал работать.

Ваш ответ

Войдите, чтобы ответить.