Можно ли иметь загрузчик данных и кеширование api rest?

Я строю сервер graphQL, чтобы обернуть несколько спокойных API. Некоторые из API-интерфейсов, которые я буду интегрировать, являются сторонними, а некоторые принадлежат нам. Мы используем redis как слой кеширования. Можно ли реализовать кеширование загрузчика данных на graphQL? Повлияет ли это на существующее кеширование Redis?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
1 049
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

очень хороший вопрос!

Dataloader служит не только одной цели. Фактически, загрузчик данных служит трем целям.

  1. Кеширование: Вы упомянули кеширование. Я предполагаю, что вы создаете шлюз / прокси GraphQL перед своим GraphQL API. Кэширование в этом случае означает, что когда вам понадобится конкретный ресурс, а позже он понадобится вам снова, вы можете вернуться к кэшированному значению. Это кеширование происходит в памяти вашего JavaScript-приложения и обычно не конфликтует с каким-либо другим типом кеширования, например. в сети.

  2. Пакетная обработка: поскольку запросы могут быть достаточно глубоко вложенными, вы в конечном итоге дойдете до точки, когда вы запрашиваете несколько значений одного и того же типа ресурса в разных частях выполнения вашего запроса. Dataloader будет собирать их и распределять ресурсы как каскад. Запросы поступают в очередь и хранятся там до завершения цикла выполнения. Затем они все «выпускаются» сразу (и, вероятно, могут быть разрешены пачками). Также все поставленные Promise разрешаются сразу (даже если некоторые результаты приходят раньше, чем другие). Это позволяет также осуществить следующий уровень выполнения в пределах одного цикла.

  3. Дедубликация: Допустим, вы получаете список BlogPost с полем author типа User. В этом списке несколько сообщений в блогах были написаны одним и тем же автором. Когда один и тот же ключ запрашивается дважды, он будет доставлен в пакетную функцию только один раз. Затем Dataloader позаботится о доставке ресурсов, выполняя соответствующие обещания.

Дело в том, что (1) и (3) могут быть достигнуты с помощью достойного http-клиента, который кэширует Запросы (а не только ответы, это означает, что не запускает другой запрос, когда он уже запущен для этого ресурса). Это означает, что возникает интересный вопрос, поддерживает ли ваш REST API пакетные запросы (например, api/user/1,2 в одном запросе вместо api/user/1 и api/user/2). В таком случае использование загрузчика данных может значительно улучшить производительность вашего API.

Может быть, вы хотите узнать, что Apollo строит прямо сейчас со своим RESTDatasource: https://www.apollographql.com/docs/apollo-server/v2/features/data-sources.html#REST-Data-Source

Другие вопросы по теме