Обзор технологии GraphQL | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 4 января, печатный экземпляр отправим 8 января.

Опубликовать статью в журнале

Автор:

Научный руководитель:

Рубрика: Информационные технологии

Опубликовано в Молодой учёный №15 (253) апрель 2019 г.

Дата публикации: 09.04.2019

Статья просмотрена: 298 раз

Библиографическое описание:

Игнатьев, А. Ю. Обзор технологии GraphQL / А. Ю. Игнатьев. — Текст : непосредственный // Молодой ученый. — 2019. — № 15 (253). — С. 22-24. — URL: https://moluch.ru/archive/253/57942/ (дата обращения: 22.12.2024).



В статье рассматривается технология GraphQL, приводится обзор достоинств и недостатков, а также сравнение с REST технологией.

Ключевые слова: GraphQL, REST, передача данных, клиент-серверная архитектура.

На сегодняшний день существует несколько интерфейсов коммуникации клиентского приложения и сервера. Они определяются способом отправления запроса, форматом передаваемых данных и форматом получаемых данных. Наиболее популярными интерфейсами коммуникации клиент-серверного приложения являются SOAP, REST, JSON API [1]. Все эти интерфейсы имеют свои достоинства и недостатки. Однако в эру развития мобильных технологий и гаджетов появляется новое значимое требование: быстрота отображения данных для мобильного интернета, который зачастую не всегда имеет большую скорость передачи данных. Более быстрой загрузки можно добиться не только увеличением скорости передачи данных, но и уменьшением количества передаваемых данных и снижением количества запросов к серверу. Для решения данной задачи была разработана технология GraphQL, предоставляющая новый гибкий интерфейс коммуникации клиентского приложения с сервером.

Технология GraphQL, разработанная компанией Facebook в 2012 году, является альтернативой REST-архитектуре. Особенность технологии GraphQL заключается в том, что она позволяет клиенту определять структуру данных, которую он хочет получить [2].

Технология GraphQL разрабатывалась для решения следующих проблем:

  1. Проблема множества запросов. Допустим, с сервера необходимо получить список всех пользователей и информацию о них. В REST-архитектуре для этого потребуется выполнить один запрос для получения списка всех пользователей и, в зависимости от исполнения API сервера, еще один или множество запросов для получения информации о них.
  2. Проблема лишних данных. Допустим, надо отобразить только имя и фамилию пользователя, а в REST-архитектуре сервер возвращает абсолютно всю информацию о нем: фамилию, имя, отчество, дату рождения и т. д.
  3. Зависимость архитектуры от протокола передачи данных. Архитектура REST привязана к HTTP и использует свойства, характерные только для HTTP: методы, коды состояния. Написанное приложение с архитектурой REST будет сложно перенести на другой канал связи, например, WebSockets или SFTP [3].
  4. Независимость кода клиента от сервера. Для устранения проблем множества запросов и лишних данных можно создавать новые методы и логику в программе. Но для этого надо одновременно изменять и клиентский код, и серверный. При этом возникает проблема версионности приложения.

GraphQL — это стандарт декларирования структуры данных и способов получения данных, который выступает дополнительным слоем между клиентом и сервером. Одной из основных отличительных особенностей GraphQL является то, что структура и объем данных определяется клиентским приложением [3].

В отличие от стандартного REST-подхода, имеющего несколько точек входа, выполняющих простые задачи, GraphQL содержит только одну точку входа, которая работает со всеми запросами. Фактически, GraphQL находится между клиентом и одним или несколькими источниками данных; он принимает запросы клиентов, перенаправляет эти запросы нужным обработчикам и возвращает необходимые данные в соответствии с переданными инструкциями.

Рассмотрим пример запроса в листинге 1. Для получения информации об авторах из города Минска, включающей имя, фамилию и перечень всех статей каждого автора, создан запрос, который указывает, какие данные необходимо получить, используя декларативную, графоподобную структуру, напоминающую формат JSON.

Листинг 1. Пример запроса GraphQL на получение информации об авторах

query {

authors(city: «Minsk») {

firstName,

lastName,

articles {

title

}

}

}

GraphQL позволяет получать данные из нескольких источников одновременно или даже из различных микросервисов, работающих на различных серверах. Структурная схема работы GraphQL представлена на рисунке 1.

Рис. 1. Структурная схема работы GraphQL

Технология GraphQL сама не может обработать входящий запрос, поэтому необходимо указать источники данных для каждого объекта в графе. Для этого созданы специальные обработчики, базовая структура которых представлена в листинге 2.

Листинг 2. Пример обработчика запроса в GraphQL

Query: {

authors(args) {

return authorsRepository.findById(args.id);

}

}

При встрече в запросе поля authors, GraphQL находит необходимый обработчик по соответствующему имени и возвращает результат его выполнения.

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

Листинг 3. Пример распознавателя в GraphQL

mutation {

changeUserName(id: "1",

firstName: «Ivan»,

lastName: «Ivanov»)

{

birthDay

}

}

Данная мутация обновит пользователя с идентификатором 1: установит ему новое имя и фамилию, а также вернет дату рождения этого пользователя.

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

Архитектурное решение разделения запросов и мутаций отлично сочетается с принципом CQRS (Command-query responsibility segregation) [4], который является одним из важнейших принципов построения больших и расширяемых систем. Поскольку разделение запросов на чтение и команд на изменение данных позволяет избавиться от множества проблем с неожидаемым изменением данных.

Помимо запросов и мутаций, технология GraphQL содержит другие возможности, улучшающие быстроту и простоту написания запросов. К ним относятся:

− псевдонимы — позволяют давать различные имена для объектов графа, что позволяет получать несколько объектов одного типа в одном запросе;

− фрагменты — позволяют вынести в отдельную переменную повторяющиеся названия полей для различных объектов, что уменьшает размер запроса и повышает его читаемость;

− переменные — позволяют вынести значения каких-либо аргументов из тела запроса GraphQL и передавать их отдельно, что дает возможность не изменять тело запроса для различных аргументов, таких как, например, идентификатор сущности.

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

У технологии GraphQL также есть свои недостатки [5]:

  1. Проблема вложенных запросов. Использование большого числа вложенных запросов сопровождается передачей большого объема данных. При этом один запрос выгружает почти всю базу данных, что может привести к перегрузке сервера. Во избежание этого ограничивают вложенность запросов.
  2. Для определения схемы требуется дополнительный код, который должен быть синхронизирован с актуальным состоянием сущностей. Однако есть библиотеки, позволяющие генерировать схемы автоматически.
  3. Необходимость создания дополнительной логики по поиску обработчика. Для определения нужного обработчика GraphQL разбирает и анализирует запрос, что ведет к незначительному ухудшению производительности.
  4. Запросы, отправленные через GraphQL, не способны кэшироваться стандартными средствами браузера, т. к. браузер кэширует только GET запросы.

Литература:

  1. REST — это новый SOAP — URL: https://habr.com/ru/company/mailru/blog/345184/ (дата обращения: 23.02.2019)
  2. Introduction to GraphQL. — URL: https://graphql.org/learn/ (дата обращения: 23.02.2019)
  3. Что же такое этот GraphQL? — URL: https://habr.com/ru/post/326986/ (дата обращения: 23.02.2019)
  4. SQRS — URL: https://ru.wikipedia.org/wiki/CQRS (дата обращения: 23.02.2019)
  5. GraphQL — The Good and the Bad. — URL: https://scotch.io/tutorials/graphql-the-good-and-the-bad (дата обращения: 23.02.2019)
Основные термины (генерируются автоматически): REST, запрос, API, HTTP, JSON, данные, клиентское приложение, получение информации, сервер, тело запроса.


Похожие статьи

Анализ технологий разработки веб-интерфейсов

Статья посвящена анализу технологий разработки веб-интерфейсов. Рассматриваются функции программ, анализируются их недостатки и достоинства, приводится сравнительная характеристика.

Абстрактные и динамически сгенерированные контроллеры в ASP.NET

В данной статье будет рассмотрен подход автоматически сгенерированных контроллеров в одной из самых популярных технологий для написания веб-сайтов — ASP.NET Core MVC.

Рассмотрение декларативного подхода к разработке интерфейсов мобильных приложений для Android

В данной статье рассматриваются императивный и декларативный подходы к разработке интерфейсов, анализируются преимущества и недостатки библиотеки Jetpack Compose.

ETL: обзор инструментов

В статье рассматриваются понятия ETL, OLTP и OLAP. Проводится обзор ETL-инструментов от ведущих разработчиков и перспективы их применения в бизнесе.

Технология ASP.NET MVC

В статье рассматривается проектирование архитектуры приложений ASP.NET MVC. Авторы описывают теоретические основы ASP.NET MVC, которые необходимы для разработки web-приложений платформы.NET Framework.

Анализ данных на Python

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

Анализ производительности и преимуществ разных подходов в управлении данными SQL и NoSQL

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

Обзор основных технологий контент-менеджмент системы Adobe Experience Manager

В представленной работе рассматриваются основные технологии контент-менеджмент системы Adobe Experience Manager: их возможности и схема взаимодействия. Данные основываются на открытых источниках документации технологий Apache Foundation, а так же офи...

Сравнительный анализ библиотек языка PHP для формирования документов веб- сервисами

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

RESTful системы: основные принципы и применение

В этой статье речь пойдет о наиболее часто встречающейся архитектуре REST.

Похожие статьи

Анализ технологий разработки веб-интерфейсов

Статья посвящена анализу технологий разработки веб-интерфейсов. Рассматриваются функции программ, анализируются их недостатки и достоинства, приводится сравнительная характеристика.

Абстрактные и динамически сгенерированные контроллеры в ASP.NET

В данной статье будет рассмотрен подход автоматически сгенерированных контроллеров в одной из самых популярных технологий для написания веб-сайтов — ASP.NET Core MVC.

Рассмотрение декларативного подхода к разработке интерфейсов мобильных приложений для Android

В данной статье рассматриваются императивный и декларативный подходы к разработке интерфейсов, анализируются преимущества и недостатки библиотеки Jetpack Compose.

ETL: обзор инструментов

В статье рассматриваются понятия ETL, OLTP и OLAP. Проводится обзор ETL-инструментов от ведущих разработчиков и перспективы их применения в бизнесе.

Технология ASP.NET MVC

В статье рассматривается проектирование архитектуры приложений ASP.NET MVC. Авторы описывают теоретические основы ASP.NET MVC, которые необходимы для разработки web-приложений платформы.NET Framework.

Анализ данных на Python

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

Анализ производительности и преимуществ разных подходов в управлении данными SQL и NoSQL

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

Обзор основных технологий контент-менеджмент системы Adobe Experience Manager

В представленной работе рассматриваются основные технологии контент-менеджмент системы Adobe Experience Manager: их возможности и схема взаимодействия. Данные основываются на открытых источниках документации технологий Apache Foundation, а так же офи...

Сравнительный анализ библиотек языка PHP для формирования документов веб- сервисами

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

RESTful системы: основные принципы и применение

В этой статье речь пойдет о наиболее часто встречающейся архитектуре REST.

Задать вопрос