У меня есть приложение Express, которое требует очень низкой скорости ответа ~ < 200ms. Сейчас мы можем получить только этот номер, но это отдельная тема.Любой способ уменьшить количество одновременных запросов для извлечения данных и кеша в nodejs?
Мы планируем извлечь часть данных из базы данных, если они найдены в Redis, возвращают данные, если нет, тогда запустите запрос и сохраните его, чтобы повторить запрос, чтобы следующие запросы могли получить его из Redis.
Я запускаю некоторые тесты и задавался вопросом, есть ли способ уменьшить количество запросов на получение базы данных?
Например, в настоящее время наше приложение имеет 300 рек/с в поле. У нас шесть боксов, работающих на AWS. Если в первый раз эта часть данных недоступна в Redis, может быть около ~ 500 запросов, пытающихся извлечь данные из БД и кеша, что в Redis. Мы пытаемся уменьшить это число. Не уверен, что в Node.js или Redis есть способ справиться с этим.
Вот код, который я тестирую.
client.getAsync('key').then(function (data) {
if(data) {
console.log(data); // Return this data if found
res.send(data);
} else {
// I'm trying to reduce the number of calls for concurrent requests in this block.
console.log('not found');
var dataFromDb = // fetch data from DB
client.set('key', dataFromDb); // Fire and forget
res.send('not found'); // Return not found right away
}
});
И я испытываю вызов с помощью ab
ab -n 20 -c 10 http://localhost:8081/redis
Это результаты, которые я получил
not found
not found
not found
not found
not found
not found
something
not found
something
something
something
something
something
something
something
something
something
something
В этом примере есть 7 запросов, пытающихся извлечь базу данных с теми же данными и сохранить в Redis.
Мой вопрос в том, есть ли способ уменьшить количество запросов? Поскольку выборка DB довольно медленная на данный момент ~ 900 мс (мы пытаемся ее оптимизировать)
Это зависит. Например, вы можете разогревать свой кеш при его покраснении или уничтожении или при повторной публикации приложения вы можете сделать распределенную блокировку, когда вы извлекаете данные из БД, чтобы разрешить доступ только одному клиенту, и после этого получить его из redis –
Спасибо за ваш ответ. Любой пример, которому я могу следовать? Я не знаком с распределенной блокировкой. – toy
есть алгоритм redlock, предоставляемый командой Redis –