Можно ли выполнять какие-либо параллельные вычисления в поле GraphQL Object с использованием Tokio и Juniper?

Этот вопрос может быть тесно связан с этой проблемой GitHub.

У меня есть сервер GraphQL, написанный на Rust с использованием Juniper. Этот сервер должен выполнить некоторые HTTP-запросы для создания и отправки данных, требуемых клиентами.

Для некоторых полей может потребоваться до ~15 HTTP-запросов, самое большее (по сути, коллекции). Последовательное выполнение этих запросов может занять некоторое время, и я подумывал об использовании Tokio + Futures для их параллельного выполнения. Это кажется технически выполнимым, но до сих пор я понятия не имею, как на самом деле реализовать такое решение, и не смог найти ни одного примера с использованием Juniper и Tokio, пока не обнаружил проблему GitHub, упомянутую ранее...

Что-то вроде следующего:

graphql_object(Whatever: MyContext |&self| {
    field parallel_requests(&executor) -> ??? {
        multiple_parallel_http_requests()
    }
}

куда ??? является FieldResult<Vec<AnyResource>>(?). И если да, то как?

1 ответ

Juniper еще не настроен для обработки параллельного разрешения полей и не интегрируется ни с какими асинхронными средами, такими как Tokio. Вместо этого вы можете сделать это самостоятельно под одеялом. Если у вас есть итератор запросов, которые вам нужно сделать, вы можете перенести их в пул потоков с помощью ящика Rayon, который предоставляет функцию .par_iter() это может автоматически распараллелить работу.

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

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