Я делаю услугу, которая извлекает фотографию с удаленного хоста и выполняет некоторую обработку, прежде чем передавать ее клиенту. Он кэширует извлеченную исходную фотографию локально, чтобы избежать ее повторного использования позже.
Однако, если есть несколько запросов в быстрой последовательности, исходное изображение еще не будет сохранено локально, и будут выполнены ненужные повторные попытки.
Какой хороший подход отложить входящие запросы до тех пор, пока исходное изображение не будет кэшировано, если оно уже в настоящее время извлекается?
В настоящее время я использую потоки Node.js полностью из потока входящего запроса, передавая его через мою логику кэширования и преобразования, передавая его в исходящий поток.
Вы можете кэшировать обещание, чтобы все входящие запросы на один и тот же ресурс требовали только одну поездку, избегая заливки базы данных или какого-либо 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
вернет то же обещание, когда обещание будет разрешено, оба запроса получат тот же ответ.