Обработка большого количества одинаковых запросов в 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;
        }
Другие вопросы по тегам