Node.js API - дублирование запросов данных от нескольких клиентов - PullRequest
0 голосов
/ 08 июня 2018

У меня есть API Node.JS, использующий Restify, который по сути является агрегатором для нескольких других API для использования внутри листа Google.

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

Я реализовал элементарное кэширование на основе памяти - если поступит запрос на те же данные, он будет обслуживать его из памяти до тех пор, покаистекает время истечения (скоро я могу перейти в Redis).

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

Как эффективно приостановить второй запрос и дождаться, пока данные поступят из первого запроса?Я не против иметь большое время ожидания и ждать окончания первого запроса до начала второго, или, в качестве альтернативы, выполнима какая-то логика «отступи и попробуй через минуту».

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

Это не такЯ могу регулярно запрашивать и кэшировать данные на стороне сервера, поскольку потенциальный диапазон значений, которые могут запрашивать клиенты, достаточно высок.

1 Ответ

0 голосов
/ 08 июня 2018

Храните тайник с обещаниями.Если запрос выполняется, кеш будет указывать, что он уже запрошен, и вы все еще можете await неразрешенное обещание, а затем ответить на оба запроса, когда данные будут готовы.

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

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

...