Отложите HTTP-запросы Node.js, если аналогичная работа уже выполняется

1

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

Однако, если есть несколько запросов в быстрой последовательности, исходное изображение еще не будет сохранено локально, и будут выполнены ненужные повторные попытки.

Какой хороший подход отложить входящие запросы до тех пор, пока исходное изображение не будет кэшировано, если оно уже в настоящее время извлекается?

В настоящее время я использую потоки Node.js полностью из потока входящего запроса, передавая его через мою логику кэширования и преобразования, передавая его в исходящий поток.

Теги:
http

1 ответ

2

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

const Cache = {};

function getPhoto(photoId) {

    let cacheKey = 'photo-${photoId}';
    let photoCache = Cache[cacheKey];

    if (photoCache instanceof Promise)
        return photoCache; //Return the promise from the cache

    let promise = new Promise((resolve, reject) => {

        if (photoCache) //Return the photo if exists in cache.
            return resolve(photoCache);

        return processPhoto(photoId).then(response => {
            //Override the promise with the actual response
            Cache[cacheKey] = response; 
            resolve(response);

        }).catch(err => { 
            Cache[cacheKey] = null; //We don't want the rejected promise in cache!
            reject();
        });

    });

    if (!photoCache)
        Cache[cacheKey] = promise; //Save the promise       

    return promise;
}

function processPhoto(photoId){

 return new Promise((resolve, reject) => {

      // Get the image from somewhere...
      // Process it or whatever you need

      //...
      resolve('someResponse');
 });

}
  • Первый запрос на конкретную фотографию выполнит поиск и сохранит обещание в кеше.
  • Второй запрос приходит, и если фотография с первого запроса еще не получена, getPhoto вернет то же обещание, когда обещание будет разрешено, оба запроса получат тот же ответ.
  • Третий запрос приходит после того, как фотография уже получена, так как фотография кэшируется, она просто вернет ответ.
  • 1
    Я реализовал это, используя эту технику, и это сработало! Спасибо!
  • 0
    @ Sune Я вижу, что вы новичок в SO, не забудьте принять ответ, это помогло вам (галочка в левом верхнем углу), это также даст вам некоторую репутацию. Вы не обязаны это делать, но это поможет будущим пользователям, ура.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню