Обработка большого количества одинаковых запросов в Azure/IIS WebRole
У меня есть HTTP API на основе облачной службы Azure, который в настоящее время обслуживает свои данные из базы данных SQL Azure. У нас также есть кэш ролей на стороне WebRole.
Обычно эта модель работает нормально для нас, но иногда происходит то, что мы получаем большое количество запросов на один и тот же ресурс в течение короткого промежутка времени, и если этот ресурс отсутствует в кэше, все запросы отправляются непосредственно в наш БД, которая является проблемой для нас, так как БД не может выдерживать такую большую нагрузку.
Рассматривая природу проблемы, кажется, что это должна быть довольно распространенная проблема, с которой столкнется большинство людей, создающих API. Я думал, что если так или иначе, я могу послать только 1-й запрос в БД и удерживать все оставшиеся до того времени, когда 1-й завершится, чтобы контролировать нагрузку, идущую в БД, но у меня все получилось. Есть ли какой-нибудь стандартный / рекомендуемый способ сделать это в Azure /IIS?
1 ответ
То, как мы справляемся с этим сценарием, - это помещать вызовы в БД в операторе блокировки. Таким образом, только один вызывающий абонент ударит по БД. Вот псевдокод, который вы можете попробовать:
var cachedItem = ReadFromCache();
if (cachedItem != null)
{
return cachedItem;
}
lock(object)
{
cachedItem = ReadFromCache();
if (cachedItem != null)
{
return cachedItem;
}
var itemsFromDB = ReadFromDB();
putItemsInCache(itemsFromDB);
reurn itemsFromDB;
}