Оптимизация тонкого контроля доступа и производительности запросов GraphQL

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

Управление доступом GraphQL и оптимизация запросов

Управление доступом

Авторизация – это набор правил или бизнес-логики, определяющих, имеет ли пользователь, сеанс или контекст список управления доступом (ACL) для выполнения определенных действий или просмотра определенных данных.

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

Оптимизация запросов

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

Способы оптимизации запросов GraphQL 

  • N+1 (Пакетная загрузка) 
  • Переизбыточное и недостаточное извлечение
  • Кэширование для снижения задержки
  • Пагинация

Улучшение управления доступом GraphQL и оптимизации запросов GraphQL

Движок авторизации проверяет права доступа к узлам и полям с использованием ACL (списка контроля доступа) и оптимизирует запросы GraphQL на основе этих прав. Кроме того, N+1 Resolver улучшает производительность, консолидируя запросы. Этот подход решает проблему N+1. 

Figure 1



Актеры

  • Запрос GraphQL: Запрос, отправляемый клиентом на сервер GraphQL для получения конкретных данных.
  • Движок GraphQL: Обозначает службу, которая позволяет выполнять запросы GraphQL.
  • Движок авторизации: Проверяет права доступа узлов и полей с использованием ACL и оптимизирует запрос GraphQL на основе прав доступа к полям.
  • N+1 Resolver: Уменьшает накладные расходы и задержки, связанные с множественными запросами к базе данных, улучшая производительность и эффективность.

Figure 2

Figure 3

Улучшение контроля доступа

Существующая реализация

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

Однако данные поставщика ограничены для пользователей-администраторов, а некоторые поля поставщика доступны только для определенных ролей. С другой стороны, продукты являются общедоступными и могут быть просмотрены с ролью Владельца продукта. Выполнение упомянутого запроса (Рисунок 3) вернет данные о продукте вместе с связанными данными о поставщике и адресе, что приведет к проблеме безопасности.

Улучшенная реализация

Узлы и поля запроса проверяются в соответствии с разрешениями пользователя, и генерируется оптимизированный запрос GraphQL.

Figure 3.1 (Flow Diagram)

 

Figure 4

Рисунок 4 является примером того, как вы можете реализовать пользовательскую аутентификацию в GraphQL API с использованием Node.js. В этом коде роль извлекается из заголовка Authorization и затем используется вместе с запросом для проверки авторизации.

Figure 5

В этом примере мы используем роль и разрешения пользователя из сеанса или запроса, которые контролируют доступ к конкретным запросам и мутациям в схеме GraphQL. Мы определили правила роли и разрешений в схеме GraphQL для всех пользователей.

Этот метод рекурсивно проверяет роль и разрешения на всех узлах и полях. Если узел или поле не допускается, то выполняется одно из следующих действий в зависимости от конфигурации:

  • Удалить узел или поле.
  • Вернуть поле или узел с сообщением об ошибке.
  • Выбросить исключение.

После того как запрос GraphQL будет проверен на соответствие схеме, этот метод вернет оптимизированный запрос GraphQL.

Улучшение оптимизации запросов ORM с использованием N+1

Существующая реализация

Это техническая проблема, которая влияет на производительность запроса. Она может возникнуть в приложениях, использующих Object-Relational Mapping (ORM) для доступа к базе данных.

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

Предположим, есть 2 продукта; необходимо сделать 1 запрос для получения продуктов и 2 дополнительных запроса для индивидуального получения поставщиков для каждого продукта.

Figure 6

Figure 7

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

Улучшенная реализация

Когда запрос достигает разрешителя N+1, разрешитель N+1 оптимизирует запросы, чтобы минимизировать количество запросов к базе данных, сведя их к одному запросу для основных данных и дополнительному запросу для связанных данных, эффективно устраняя проблему N+1.

  1. Запрос основных данных: Один запрос, который получает основной набор данных, необходимый приложению.
  2. Запрос связанных данных: Дополнительный запрос, который получает любые связанные данные, необходимые для завершения набора данных.

Figure 8

Figure 9: Total No. of Queries are 2 (1 for Product, 1 for Vendor)

Figure 10

После завершения всех разрешителей запросов сервер возвращает оптимизированные данные клиенту в формате JSON.

Заключение

Мы подчеркнули, что внедрение механизмов авторизации с тонкой настройкой, вместе с улучшенными мерами безопасности, крайне важно для обеспечения безопасности GraphQL API. Это включает в себя как уровень узла, так и уровень поля.

Как описано в этой статье, проблема N+1 возникает, когда неоптимизированный запрос приводит к избыточным вызовам базы данных в GraphQL. Мы предоставили решение для преодоления проблемы N+1. Это снижает использование ресурсов сервера базы данных, что приводит к экономии затрат и улучшению масштабируемости. Кроме того, улучшая производительность запросов, это улучшает опыт пользователя за счет сокращения времени ответа на запрос.

Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries