очень хороший вопрос!
Dataloader не только служит одной цели. На самом деле есть три цели, которые служит для загрузки данных.
Кэширование: Вы упомянули кеширование. Я предполагаю, что вы создаете шлюз / прокси GraphQL перед своим API GraphQL. Кэширование в этом случае означает, что когда вам нужен определенный ресурс, а позже он понадобится вам снова, вы можете вернуться к кешированному значению. Это кэширование происходит в памяти вашего приложения JavaScript и обычно не конфликтует с любым другим типом кэширования, например в сети.
Пакетирование: поскольку запросы могут быть вложены достаточно глубоко, вы в конечном итоге получите точку, где вы запрашиваете несколько значений одного и того же типа ресурса в разных частях выполнения вашего запроса. Dataloader в основном собирает их и разрешает ресурсы как каскад. Запросы поступают в очередь и хранятся там до завершения цикла выполнения. Затем они все «освобождаются» одновременно (и, вероятно, могут быть решены партиями). Также доставленные Promise
все разрешаются одновременно (даже если некоторые результаты приходят раньше, чем другие). Это позволяет следующему уровню выполнения также происходить в течение одного цикла.
Дубликация: допустим, вы получаете список BlogPost
с полем author
типа User
. В этом списке несколько сообщений в блоге были написаны одним и тем же автором. Когда один и тот же ключ запрашивается дважды, он будет доставлен только один раз в пакетную функцию. Затем Dataloader позаботится о доставке ресурсов, выполнив соответствующие обещания.
Дело в том, что (1) и (3) можно достичь с помощью приличного http-клиента, который кэширует запросы (а не только ответы, это означает, что не запускает другой запрос, когда он уже работает для этого ресурса). Это означает, что интересный вопрос заключается в том, поддерживает ли ваш REST API пакетные запросы (например, api/user/1,2
в одном запросе вместо api/user/1
и api/user/2
). Если это так, использование dataloader может значительно повысить производительность вашего API.
Может быть, вы хотите посмотреть, что сейчас строит Аполлон с их RESTDatasource
: https://www.apollographql.com/docs/apollo-server/v2/features/data-sources.html#REST-Data-Source