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





очень хороший вопрос!
Dataloader служит не только одной цели. Фактически, загрузчик данных служит трем целям.
Кеширование: Вы упомянули кеширование. Я предполагаю, что вы создаете шлюз / прокси GraphQL перед своим GraphQL API. Кэширование в этом случае означает, что когда вам понадобится конкретный ресурс, а позже он понадобится вам снова, вы можете вернуться к кэшированному значению. Это кеширование происходит в памяти вашего JavaScript-приложения и обычно не конфликтует с каким-либо другим типом кеширования, например. в сети.
Пакетная обработка: поскольку запросы могут быть достаточно глубоко вложенными, вы в конечном итоге дойдете до точки, когда вы запрашиваете несколько значений одного и того же типа ресурса в разных частях выполнения вашего запроса. Dataloader будет собирать их и распределять ресурсы как каскад. Запросы поступают в очередь и хранятся там до завершения цикла выполнения. Затем они все «выпускаются» сразу (и, вероятно, могут быть разрешены пачками). Также все поставленные Promise разрешаются сразу (даже если некоторые результаты приходят раньше, чем другие). Это позволяет также осуществить следующий уровень выполнения в пределах одного цикла.
Дедубликация: Допустим, вы получаете список 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