Заявка на услуги DST
Наш специалист свяжется с вами, обсудит оптимальную стратегию сотрудничества,
поможет сформировать бизнес требования и рассчитает стоимость услуг.
GraphQL — это специализированный язык запросов для работы с данными, разработанный компанией «Фейсбук»* в 2012 году. Он решил проблему производительности мобильных приложений, которые часто получали от сервера избыточные или неполные данные. В 2015 году технология стала общедоступной, а позже перешла под управление Linux Foundation.
До GraphQL разработчики в основном использовали REST API для взаимодействия с сервером. В REST-архитектуре у каждого ресурса есть уникальный URL-адрес, а клиенты общаются с сервером через HTTP-методы: GET, POST, PUT, DELETE и другие.
Что такое GraphQL?
GraphQL — это язык запросов, используемый клиентскими приложениями для работы с данными. C GraphQL связано такое понятие, как «схема» — это то, что позволяет организовывать создание, чтение, обновление и удаление данных в вашем приложении (то есть — перед нами четыре базовые функции, используемые при работе с хранилищами данных, которые обычно обозначают акронимом CRUD — create, read, update, delete).
Выше было сказано, что GraphQL используется для работы с данными в «вашем приложении», а не «в вашей базе данных». Дело в том, что GraphQL — это система, независимая от источников данных, то есть, для организации её работы неважно — где именно хранятся данные.
Если взглянуть, ничего не зная о GraphQL, на название этой технологии, то может показаться, что перед нами что-то очень сложное и запутанное. В названии технологии имеется слово «Graph». Означает ли это, что для того, чтобы её освоить, придётся учиться работать с графовыми базами данных? А то, что в названии есть «QL» (что может значить «query language», то есть — «язык запросов»), означает ли, что тем, кто хочет пользоваться GraphQL, придётся осваивать совершенно новый язык программирования?
Эти страхи не вполне оправданы. Для того чтобы вас успокоить — вот жестокая правда об этой технологии: она представляет собой всего лишь приукрашенные GET или POST запросы. В то время как GraphQL, в целом, вводит некоторые новые концепции, касающиеся организации данных и взаимодействия с ними, внутренние механизмы этой технологии полагаются на старые добрые HTTP-запросы.
Как технология GraphQL улучшает то, для чего использовалась технология REST
При поверхностном анализе вышеописанной ситуации может показаться, что перед нами всего лишь незначительная проблема. «Что плохого в том, что мы отправляем клиенту ненужные данные?». Для того чтобы понять масштабы, в которых «ненужные данные» могут стать большой проблемой, вспомним о том, что технология GraphQL была разработана компанией Facebook. Этой компании приходится обслуживать миллионы запросов в секунду.
Что это значит? А то, что при таких объёмах значение имеет каждая мелочь.
GraphQL, если продолжить аналогию с рестораном, вместо того, чтобы «нести» посетителю «то, что есть», приносит именно то, что посетитель заказывает.
Мы можем получить от GraphQL ответ, ориентированный на тот контекст, в котором используются данные. При этом нам не нужно добавлять в систему «одноразовые» точки доступа, выполнять множество запросов или писать многоэтажные условные конструкции.
Зачем нужен GraphQL
GraphQL повысил производительность приложений многих компаний. К примеру, GitHub сократил количество запросов к API на 80% для некоторых страниц, а Netflix уменьшил объём передаваемых данных на 30–40%.
Помимо оптимизации запросов, GraphQL решает и другие важные задачи:
- Упрощает интеграцию различных систем и микросервисов, создавая единый API для доступа к разным источникам данных. Например, можно объединить данные из системы управления товарами, платёжной платформы и службы доставки.
- Ускоряет процесс разработки, позволяя адаптировать запросы под клиента без изменения серверной части. Например, мобильное приложение может запрашивать базовую информацию о пользователе, а веб-версия — расширенные данные. Это позволяет использовать один API для разных клиентов без изменений на сервере.
- Упрощает работу с API. GraphQL использует единую точку доступа для всех запросов, что позволяет мгновенно интегрировать новую информацию в систему. Например, если к товарам в интернет-магазине добавить новую характеристику, то она сразу станет доступной для всех клиентских приложений — для этого не придётся обновлять API или создавать новые точки доступа.
- Обеспечивает простое обновление API. Разработчики могут добавлять новые поля в схему GraphQL, не нарушая работу существующих клиентов. Это позволяет постепенно расширять функциональность API без создания новых версий или нарушения обратной совместимости. Например, если добавить поле «рейтинг» для товара, существующие приложения продолжат работать без изменений, а новые смогут использовать эту дополнительную информацию.
Преимущества GraphQL
GraphQL и REST — это не единственные технологии для работы с API и обмена данными. Вот ещё несколько популярных решений:
- gRPC (gRPC remote procedure call) — это фреймворк, который применяется в микросервисной архитектуре и высоконагруженных системах, требующих максимальной производительности. Например, при потоковой передаче видео или обработке транзакций.
- OData (open data protocol) — это протокол для стандартизации API в корпоративной среде, позволяющий фильтровать и сортировать данные через URL-параметры. С ним удобно создавать динамические отчёты для анализа продаж, инвентаризации и так далее.
- SOAP (simple object access protocol) — это протокол для обмена данными между корпоративными сетями, базами данных и прочими системами. SOAP часто используется в банковской сфере. Например, для отправки запроса на проверку баланса счёта клиента или проведения денежного перевода.
- Falcor — это библиотека для оптимизации передачи данных между клиентом и сервером, разработанная Netflix. Она повышает производительность веб-приложений с большими объёмами данных. Например, при просмотре каталога фильмов Falcor загружает только те данные, которые видны на экране. При дальнейшей прокрутке страницы подгружаются новые постеры и описания, а неактуальная информация очищается из памяти.
Каждая из перечисленных технологий обладает своими особенностями, но есть характеристики, благодаря которым разработчики часто отдают предпочтение именно GraphQL:
- Гибкость запросов. В отличие от REST и SOAP, GraphQL позволяет клиентам запрашивать только необходимые данные, что уменьшает объём передаваемой информации и количество запросов. Например, с помощью GraphQL можно одним запросом получить профиль пользователя, его посты и список друзей. В случае с REST для этого пришлось бы выполнить несколько отдельных запросов. Пример подобных запросов мы рассмотрели в начале статьи.
- Типизация данных. В отличие от REST, GraphQL обладает встроенной строгой системой типов, что упрощает валидацию данных и снижает вероятность ошибок при разработке. Например, если в схеме GraphQL поле age определено как целое число, сервер автоматически отклонит запрос с некорректным значением — строкой тридцать вместо числа 30.
- Версионирование API. В отличие от REST и SOAP, GraphQL позволяет добавлять новые поля и типы без нарушения работы существующих запросов. Например, вы можете добавить поле phoneNumber к типу User в схеме GraphQL. После изменения существующие клиенты продолжат работать как прежде, а новые смогут использовать добавленное поле без создания новой версии API.
- Производительность в сложных сценариях. По сравнению с gRPC, GraphQL эффективнее обрабатывает комплексные запросы, когда необходимо получить связанную информацию из разных источников. Например, в e-commerce-приложении GraphQL может одним запросом извлечь детали товара, информацию о его наличии, отзывы и скидки. При использовании gRPC для получения той же информации потребовалось бы несколько вызовов.
Как и любая технология, GraphQL имеет свои недостатки, и один из ключевых — сложность кэширования. В REST кэширование настраивается с помощью стандартных HTTP-заголовков, а GraphQL не поддерживает эту функцию напрямую. Для решения этой проблемы необходимо использовать дополнительные библиотеки или разрабатывать собственную логику кэширования. Из-за этого GraphQL часто комбинируют с другими технологиями.
Как работает GraphQL?
Как мы уже говорили, GraphQL, для передачи данных клиенту и получения их от него, полагается на простые GET или POST-запросы. Если подробнее рассмотреть эту мысль, то оказывается, что в GraphQL есть два вида запросов. К первому виду относятся запросы на чтение данных, которые в терминологии GraphQL называются просто запросами (query) и относятся к букве R (reading, чтение) акронима CRUD. Запросы второго вида — это запросы на изменение данных, которые в GraphQL называют мутациями (mutation). Они относятся к буксам C, U и D акронима CRUD, то есть — с их помощью выполняют операции создания (create), обновления (update) и удаления (delete) записей.
Все эти запросы и мутации отправляют на URL GraphQL-сервера, который, например, может выглядеть как myapp.com/graphql, в виде GET или POST-запросов.
GraphQL функционирует по принципу «запрос — ответ» между клиентом и сервером:
- На сервере создаётся схема, описывающая все доступные типы данных, поля и операции, которые можно выполнить через API.
- Клиент формирует запрос, точно указывая необходимые данные.
- Клиент отправляет запрос на сервер через HTTP-метод POST.
- Сервер анализирует запрос, проверяет его соответствие схеме и выполняет нужные операции для получения данных.
- Сервер отправляет клиенту ответ, содержащий только запрашиваемую информацию.
- Клиент получает данные и использует их для обновления интерфейса или других операций.
Для построения запросов GraphQL используются шесть основных компонентов: поля (fields), аргументы (arguments), фрагменты (fragments), псевдонимы (aliases), переменные (variables) и директивы (directives).
Советы по работе с GraphQL
Обеспечение согласованности имен в схеме. Согласованное именование в схемах GraphQL упрощает и повышает эффективность идентификации данных. Если разработчик не настроил наименование схемы и не придерживается определенного стандарта, в одной и той же схеме можно найти разные имена или свойства, которые ссылаются на одни и те же данные. Это может вызвать проблемы при дальнейших действиях.
Отказ от жестко заданных аргументов. Лучше избегать жестко заданных параметров, которые встраивают данные прямо в исходный код. Они добавляют все, включая конфиденциальные данные, в строки запроса. В результате важная информация может стать доступной для взломщиков. Помимо очевидных рисков для конфиденциальности, связанных с жестко заданными параметрами, также возникают проблемы с кэшированием. При попытке кэшировать запросы API жестко заданные параметры могут занимать много места и снижать общую производительность.
Удаление нелогичных фрагментов. В GraphQL фрагменты — это логические элементы, которые могут использоваться одновременно для запросов и мутаций. Фрагменты помогают сделать каждый запрос коротким, удобочитаемым и последовательным. Но при неправильном использовании некоторые фрагменты могут принести больше вреда, чем пользы. Один из способов убедиться в необходимости всех фрагментов — использовать их только в тех полях схемы, которые имеют логическое значение. Неправильное или нелогичное добавление фрагментов может привести к обратному эффекту и затруднить чтение запроса.
Зачем может понадобиться использовать GraphQL?
Хотя то, созданием чего мы только что занимались, выглядит не особенно масштабно, сейчас у нас есть функционирующее, хотя и простое, GraphQL-API.
Как и в случае с любой новой технологией, после первого знакомства с GraphQL вы можете задаться вопросом о том, зачем вам может пригодиться нечто подобное. Честно говоря, на этот вопрос нельзя дать однозначного и простого ответа. Очень уж много всего нужно учесть для того, чтобы такой ответ найти. И можно, кстати, подумать о том, чтобы вместо GraphQL просто выбрать проверенную временем технологию REST или напрямую обращаться к базе данных. Собственно говоря, вот несколько идей, над которыми стоит поразмыслить в поисках ответа на вопрос о том, нужна ли вам технология GraphQL.
Вы стремитесь уменьшить количество запросов, выполняемых с клиента
Многие приложения страдают от того, что им приходится выполнять слишком много HTTP-запросов, от того, что делать это приходится слишком часто, и от того, что это — сложные запросы. В то время как использование технологии GraphQL не позволяет полностью отказаться от выполнения запросов, эта технология, если ей правильно пользоваться, способна значительно уменьшить количество запросов, выполняемых со стороны клиента (во многих случаях для получения некоего набора связанных данных достаточно лишь одного запроса).
Является ли ваш проект приложением с множеством пользователей, или приложением, обрабатывающим огромные объёмы данных (например — это нечто вроде системы для работы с медицинскими данными), использование GraphQL определённо улучшит производительность его клиентской части.
Вы хотите избежать денормализации данных, проводимой лишь ради того, чтобы оптимизировать работу механизмов построения пользовательского интерфейса
В приложениях, в которых используются большие объёмы реляционных данных, часто может возникать «ловушка денормализации». Хотя такой подход и оказывается рабочим, он, вне всякого сомнения, далёк от идеала. Его применение может плохо влиять на производительность систем. Благодаря использованию GraphQL и вложенных запросов необходимость в денормализации данных значительно уменьшается.
У вас есть множество источников информации, к которым вы обращаетесь из разных приложений
Эта проблема может быть частично решена с помощью традиционных REST API, но даже при таком подходе одна проблема всё ещё остаётся: единообразие запросов, выполняемых с клиентской стороны. Предположим, что в ваш проект входят веб-приложение, приложения для iOS и Android, а также API для разработчиков. В подобных условиях вам, вероятнее всего, придётся, на каждой платформе, «мастерить из подручных материалов» средства для выполнения запросов.
Это ведёт к тому, что приходится поддерживать, на разных платформах, несколько реализаций HTTP, это означает отсутствие единообразия в средствах выполнения запросов и наличие запутанных конечных точек API (вы, наверняка, такое уже видели).
Может быть технология GraphQL — это верх совершенства? Стоит ли мне прямо сейчас выбросить мой REST API и перейти на GraphQL?
Нет, конечно. Ничто не совершенно. И, надо отметить, работать с GraphQL не так уж и просто. Для того чтобы создать работающую схему GraphQL, нужно выполнить множество обязательных шагов. Так как вы только изучаете данную технологию, это может вывести вас из равновесия, так как нелегко бывает понять то, чего именно не хватает в вашей схеме для правильной работы системы. При этом сообщения об ошибках, возникающих на клиенте и на сервере, могут оказаться не особенно полезными.
Далее, использование GraphQL на клиенте, в том, что выходит за рамки языка запросов, не стандартизовано. Хотя работу с GraphQL могут облегчить различные библиотеки, самыми популярными из которых являются Apollo и Relay, каждая из них отличается собственными специфическими особенностями.
GraphQL — это, кроме того, всего лишь спецификация. Пакеты вроде graphql (этот пакет используется внутри пакета express-graphql, применённого в нашем примере) — это всего лишь реализации данной спецификации. Другими словами, разные реализации GraphQL для разных языков программирования могут по-разному интерпретировать спецификацию. Это может привести к возникновению проблем, идёт ли речь о разработчике-одиночке, или о команде, в которой, при работе над разными проектами, используются разные языки программирования.
Итоги
Несмотря на то, что внедрение GraphQL может оказаться непростой задачей, эта технология представляет собой впечатляющий шаг вперёд в сфере обработки данных. GraphQL нельзя назвать лекарством от всех болезней, но с этой технологией, определённо, стоит поэкспериментировать. Начать можно, например, поразмыслив о самой запутанной и неопрятной подсистеме, используемой в вашем проекте при работе с данными, и попытавшись реализовать эту подсистему средствами GraphQL.
Кстати, GraphQL можно реализовывать инкрементно. Для того чтобы извлечь выгоды из применения этой технологии нет нужды переводить на GraphQL абсолютно всё. Так, постепенно вводя в проект GraphQL, можно разобраться с этой технологией самому, заинтересовать команду, и, если то, что получится, всех устроит, двигаться дальше.
Главное по мнению разработчиков компании DST Global — помнить о том, что GraphQL — это, в конечном счёте, всего лишь инструмент. Применение GraphQL не означает необходимости в полной переработке всего, что было раньше. При этом надо отметить, что GraphQL — это технология, с которой, определённо, стоит познакомиться. Многим стоит подумать и о применении этой технологии в своих проектах. В частности, если ваши проекты кажутся не особенно производительными, если вы занимаетесь разработкой сложных интерфейсов, наподобие панелей управления, лент новостей или профилей пользователей, то вы уже знаете о том, где именно вы можете опробовать GraphQL.
Наш специалист свяжется с вами, обсудит оптимальную стратегию сотрудничества,
поможет сформировать бизнес требования и рассчитает стоимость услуг.
Ижевск, ул. Воткинское шоссе, д. 170 Е, Технопарк Нобель, офис 1117
Задать вопрос по почте
Сопоставление плюсов и минусов поможет решить, нужен ли GraphQL вашему проекту – или лучше обойтись REST API.
Преимущества GraphQL:
— Клиент может получать только те данные, которые ему нужны.
— Типизация и автоматическая валидация позволяет клиентам легко понять, какие данные и типы доступны в API, и точно формулировать запросы.
— Клиенты не зависят от серверных изменений в структуре данных.
Недостатки GraphQL:
— Возможные проблемы с производительностью. Поддержка иерархических запросов с глубокими уровнями вложенности могут привести к проблемам с производительностью. Для их предотвращения стоит внедрить лимиты на количество вложенных уровней или ограничение частоты запросов.
— Для небольших и простых приложений функциональность GraphQL может быть излишней.
— GraphQL не поддерживает кэширование на уровне HTTP. Это может привести к увеличению нагрузки на сервер, так как каждый запрос будет выполняться заново, а не извлекаться из кэша.
GraphQL состоит из нескольких компонентов, каждый из которых играет важную роль в обработке данных. В его состав входят:
— schemas (схемы),
— resolvers (преобразователи),
— queries (запросы),
— mutations (мутации).
Схемы. GraphQL использует строгую систему типов, в которой все типы данных записываются на языке определения схем GraphQL (SDL). Типизированные схемы определяют формы данных, которые могут запрашиваться в API, а также взаимосвязи между типами и операциями, доступными пользователю.
Другими словами, они определяют возможности API и форму данных, с которыми клиенты могут взаимодействовать. Конфигурация этой схемы в итоге определяет, как можно использовать API. По мере поступления запросов схема используется для проверки запросов, а GraphQL выполняет только выборочные из них.
Преобразователи. Каждое поле в схеме поддерживается преобразователем, который заполняет данные и определяет реакцию на набор полей. Он может извлекать информацию из базы данных, облачного сервиса или из другого источника.
При запуске поля запроса система генерирует вызов соответствующего преобразователя для получения следующего значения. Если поле выдает скалярное значение (например, строку или число), выполнение завершается. Если оно содержит объектное значение, запрос включает дополнительные значения для этого объекта. Этот процесс продолжается до тех пор, пока не останутся только скалярные поля. Преобразователи также упрощают форматирование информации и помогают системе объединять информацию из различных источников.
Запросы. Их отправляют клиенты на сервер. Он определяет, какие данные клиент хочет получить. Запросы определяются в типе, который представляет собой специальный объект в коде, определяющий точку входа верхнего уровня для каждого запроса, который клиенты могут выполнять. Каждый тип запроса также определяет имя и вид возвращаемого значения для каждой точки входа.
Когда поступает запрос, GraphQL проверяет его на соответствие определениям схемы и, предполагая, что запрос корректен, выполняет его. Структура обычно отражает структуру данных ответа, что делает требования к виду информации более понятными.
Мутации. Это операции, которые создают, обновляют или удаляют данные на сервере. Они аналогичны операциям POST, PUT, PATCH и DELETE в RESTful API. Хотя пользователи могут получать доступ к некоторым запросам без аутентификации, мутации всегда требуют ее наличия (например, с помощью токена). Аналогично запросам, мутации в GraphQL проверяются на соответствие схеме и ее определениям. Как только мутация проверена и запущена, сервер возвращает ответ в формате JSON (текстовый формат на JavaScript).
В чем преимущества GraphQL
Скорость. GraphQL работает намного быстрее, чем другие коммуникационные API. Он позволяет сократить количество запросов, выбирая только нужные поля.
Совместимость со сложными системами и микросервисами. Сервер инструмента используется для получения данных из существующих систем и представления их в формате ответов. Это наиболее подходящий формат для устаревших инфраструктур или сторонних API, которые огромны по размеру и сложны в обслуживании и обработке. Когда нужно переходить от монолитного серверного приложения к архитектуре микросервисов, GraphQL помогает управлять взаимодействием между несколькими микросервисами. Он объединяет их в одну схему.
Отсутствие проблем с избыточной или недостаточной выборкой данных. Ответы REST иногда содержат слишком много лишней информации, а иногда ее недостаточно. Из-за этого нужного создавать повторные запросы. В GraphQL эта проблема решена. Инструмент извлекает только точные и выборочные данные в одном запросе.
Определение формы данных. При отправлении запросов сервер возвращает ответ в простой, безопасной и предсказуемой форме. Это облегчает написание конкретного запроса в соответствии с требованиями.
Строгая типизация. GraphQL — это язык со строгой типизацией, в котором каждый уровень запроса соответствует определенному типу. А каждый тип описывает набор доступных полей. Он похож на SQL и предоставляет описательные сообщения об ошибках перед выполнением запроса.
Нет необходимости в обновлении. В GraphQL результирующий набор или возвращаемые данные очень специфичны в соответствии с запросом клиента, поэтому серверу просто их обобщить. Добавление новых функций продукта или полей на сервер не влияет на работу существующих клиентов. Можно использовать старый сервер — поля могут быть устаревшими, но при этом будут продолжать работать.
— Гибкость. GraphQL не накладывает ограничений на типы запросов, что позволяет использовать его как для традиционных CRUD-операций (create, read, update, delete), так и для запросов, которые содержат несколько типов данных.
— Определение схемы. GraphQL автоматически создаёт схему для API. А за счёт иерархической организации кода и объектных отношений снижается его сложность.
— Оптимизация запросов. GraphQL позволяет клиентам запрашивать только ту информацию, что им нужна. Это уменьшает время ответа от сервера и количество данных, которые нужно передавать по сети.
— Контекст. GraphQL учитывает все детали запросов и ответов, что позволяет разработчикам фокусироваться на бизнес-логике. А строго типизированные поля предупреждают разработчиков об ошибках перед выполнением запроса.
— Расширяемость. GraphQL позволяет разработчикам расширять схему API и добавлять новые типы данных. При этом есть возможность повторного использования существующего кода и источников данных, чтобы избежать случаев избыточного кода.
gRPC обеспечивает высокую производительность и поддерживает двунаправленную передачу данных, идеален для высоконагруженных распределённых систем и микросервисов. Подходит для связи между устройствами с ограниченными ресурсами, например, для устройств интернета вещей, смарт-девайсов и камер.
GraphQL предлагает гибкие запросы и эффективную передачу данных, оптимален для сложных и детализированных API. Подходит для запросов к базам данных со множеством записей, когда нужно извлекать только необходимые данные в определённых форматах.
При необходимости эти технологии можно комбинировать в гибридных API, используя сильные стороны каждого подхода. Например, можно добавить GraphQL слой поверх существующего REST API или применять gRPC для внутреннего обмена данными, оставляя REST API для внешних клиентов
GraphQL использует единый, гибкий endpoint и язык запросов для запроса конкретных данных. Клиент может выбрать все данные одним запросом, даже если они будут располагаться в разных источниках. Это позволяет избежать избыточной или недостаточной выборки данных, сокращая объём ненужной информации, передаваемой между клиентом и сервером.
REST API используют несколько endpoints, представляющих ресурсы, со стандартными методами HTTP для выполнения операций. Из-за жёсткой структуры REST API нужно постоянно прописывать путь к данным, которые хочет получить клиент, делая выборку.
Таким образом, GraphQL упрощает разработку на стороне сервера и позволяет легче управлять версионированием и развёртыванием, в то время как REST API более прост и подходит для небольших проектов