Откат обновления схемы Graphql - PullRequest
0 голосов
/ 18 декабря 2018

Мы перемещаем некоторые из наших API в graphql и хотели бы знать, как обработать откат развернутого пакета (схема) и лучшие практики для этого.

Чтобы быть более конкретным, скажем, у нас есть схема S с 3 полями, а затем мы добавили 4-е поле "A".Теперь по какой-то причине мы не можем продолжить работу с этим пакетом и полем «А».Поэтому мы должны выполнить откат пакета, чтобы теперь в схеме не было поля «А».

Теперь какой-то потребитель может спросить об этом поле «А», и он может получить ошибку.Конечно, мы могли бы попросить наших клиентов обновить информацию, но есть временной промежуток, в течение которого мы могли бы отклонить запрос.

Как мы справляемся с этим сценарием, в частности срочным откатом в течение нескольких часов или дня?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

В общем, вы должны избегать удаления полей без предупреждения, чтобы избежать точного сценария, который вы описываете.

По мере развития вашей схемы, нередки случаи, когда некоторые поля больше не нужны.Например, вместо того, чтобы вносить радикальные изменения в определенное поле (переход от обнуляемого к ненулевому типу возврата, добавление обязательных аргументов и т. Д.), Мы можем выбрать добавление другого поля и рекомендовать клиентам переходить на использование этого поля.вместо.В таких сценариях мы хотим в конечном итоге удалить исходное поле.Самый безопасный способ сделать это - сначала осудить поле.Используя SDL, мы можем сделать это с помощью директивы:

fieldA: String @deprecated(reason: "Use fieldB instead!")

Через некоторое время вы можете полностью удалить это поле.Сколько времени вы ждете, чтобы удалить поле, зависит от вашей команды и ожиданий, которые вы связали с обработкой устаревших полей.Например, может оказаться полезным установить крайний срок, к которому все клиенты, как ожидается, прекратили использовать любые устаревшие поля.Это работает хорошо, если у ваших клиентских команд есть пропускная способность для обработки такого технического долга.

Преобразователь устаревшего поля можно изменить, чтобы он возвращал нулевое значение (если само поле обнуляемо) или некоторые минимальные фиктивные данные.Это предотвращает ненужные вызовы API или базы данных, в то же время гарантируя, что клиентские запросы не приведут к ошибке.

В контексте вашего вопроса это означает, что вам, вероятно, следует избегать отката к предыдущему выпуску и вместо этого следоватьописанный выше процесс для полей, которые вы хотите удалить.

В качестве альтернативы, вы можете рассмотреть возможность создания версий.GraphQL, как правило, уклоняется от концепции управления версиями.Как объясняет официальный сайт:

Почему большинство API-версий?Когда существует ограниченный контроль над данными, возвращаемыми из конечной точки API, любое изменение может считаться критическим изменением, а для критических изменений требуется новая версия.Если для добавления новых функций в API требуется новая версия, возникает необходимость в компромиссе между частым выпуском и наличием множества инкрементных версий по сравнению с понятностью и удобством обслуживания API.

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

Имея это в виду, также возможно реализовать реализацию версий с помощью GraphQL, обслуживая различные схемы с разных конечных точек.Хотя идти по этому пути дорого и обычно не нужно, это может быть правильным решением для вас и вашей команды, особенно если вы ожидаете, что в будущем придется сделать аналогичные откаты.

0 голосов
/ 18 декабря 2018

Вы ничего не можете сделать с GraphQL.Так как вам нужно, чтобы поле присутствовало в системе типов GraphQL.Могут быть доступны библиотеки, которые позволят вам указать, должно ли поле присутствовать в запросе или нет.Но нет никакого способа разрешить несуществующее поле в Запросе.

Но вы можете выбрать стратегию развертывания Blue-Green .В этой стратегии обе версии работают одновременно.

Допустим, Зеленый - это версия с полем A и Синий это версия без поля A .Поэтому, когда ваши клиенты обновляются, они начинают запрашивать версию Blue .И как только все ваши клиенты обновятся, отключите Зеленый ( с полем A ) .

...