Путь к GraphQL
Когда REST не вывозит
Уже более 20 лет прошло с момента появления концепции REST. За это время крупные корпорации и Open Source сообщество разработали огромное количество инструментов для REST API, предоставляя решения из коробки для быстрой и удобной разработки.
REST API стал доминировать как решение для монолитных систем. И когда началась новая волна - микросервисная архитектура, многие по инерции продолжили использовать REST API.
Традиционная модель архитектуры выглядела приблизительно так:
![](img/rest.png)
С одной стороны, количество сервисов обычно растет с невероятной скоростью, что уже создает проблему для клиентских приложений, которым иногда приходиться вызывать десятки API только при загрузке. Если браузеры еще справляются, то мобильным приложениям и смарт устройствам уже становиться плохо.
Но появилась проблема и с другой стороны - фрагментация клиентов. Помимо традиционных браузеров появились как минимум две основные мобильные платформы, множество платформ для смарт устройств и ТВ. Да и сами клиенты часто разделены на несколько независимых приложений, и не вся функциональность доступна одинаково на различных платформах.
Эти две проблемы и дали толчок новому поиску подходящей архитектуры.
За острый край
Чтобы как-то облегчить разработку клиентов, появилась архитектура, которая не полагалась на единый унифицированный набор API, а создавала агрегационный уровень для каждого класса клиентов. Появились BFF (Backend For Frontend) - бэк-енды для фронт-ендов. Сервисы, чье назначение было транслировать множество вызовов API в меньшее количество, перевариваемое клиентом.
Это отчасти привело к развитию Edge вычислений (или serverless), когда сервис уже не представляет никакой инфраструктуры, даже облачной, а всего лишь набор кода.
Архитектура стала выглядеть примерно так:
![](img/edge.png)
Однако это решает только часть проблемы. Другая часть - это оптимизация загрузки на самом клиенте. К тому же такая архитектура переносит фрагментацию из клиентов на уровень дальше, но не избавляется от неё.
Единый граф
One graph to rule them all
В 2015 году Facebook публикует спецификацию GraphQL которую они использовали для внутренней разработки инструментов с 2012 года. GraphQL представляет собой одновременно язык запросов и описания схемы данных. А также описания операций, доступных для этих данных.
GraphQL позволяет описать все сущности, связи и операции предметной области вашего бизнеса в виде цельного графа, что раньше могли сделать только бизнес-аналитики на специальных диаграммах. При этом этот граф и есть ваше API, которое могут использовать все приложения, как собственные, так и сторонние (если это, конечно, нужно).
Такой подход помогает решить проблему фрагментации клиентов и избавляет от необходимости иметь десятки BFF. Теперь каждый клиент может запрашивать только те данные, которые ему нужны, из единого графа данных организации.
Интересный факт, что компания Netflix почти одновременно в 2015 году создает Falcor - фреймворк, который позволяет представлять данные для клиентов в виде единого связанного графа сущностей. Ничего не напоминает? К сожалению, такой популярности он не завоевал.
Новая архитектура стала выглядеть примерно так:
![](img/graphql.png)
Это очень упрощенный вариант, и сегодня GraphQL позволяет создавать гораздо более оптимизированные решения, проникая глубже в архитектуру, позволяя сшивать и делегировать запросы для под-графов на сами микросервисы. (Про GraphQL Federation
мы расскажем в следующих статьях)
Так как GraphQL - это не конкретная библиотека или фреймворк, а открытая спецификация, появилась достаточно большая экосистема реализаций. Одна из самых популярных из них - это семейство решений от Apollo.
Apollo предоставляет готовые решения из коробки для клиентов, серверов, инструменты разработки, визуализации, мониторинга и многое другое.
Стоит ли начинать
Возможно, после небольшого экскурса в историю вы задались вопросом: стоит ли начинать разработку новой информационной системы или даже просто нового сервиса с использованием GraphQL сегодня?
Ответом будет - да
.
С точки зрения бизнеса, если вы хотите, чтобы ваша информационная система развивалась долгие годы, прибавляя в функциональности, при этом не наступая на те же грабли, через которые уже прошли десятки и сотни компаний по всему миру за последние 10 лет, то ответом будет - однозначно, да!
.
Есть ряд факторов, которые могут вызвать вопросы. Например, недостаточное количество разработчиков, которые хорошо разбираются в данной технологии. В этом плане будет становиться лучше, т.к. популярность GraphQL растет, и с каждым днем все больше компаний и специалистов появляются на рынке.
Кстати, мы одни из них - эксперты по GraphQL и Apollo с многолетним практическим опытом!