SETUP:
У нас есть приложение .Net, которое распределено по 6 локальным серверам с локальной базой данных (ORACLE), 1 основным сервером и 1 машиной балансировки нагрузки.Запросы поступают на балансировщик нагрузки, который перенаправляет входящие запросы на один из 6 локальных серверов.Через определенные промежутки времени данные собираются на главном сервере и перераспределяются на 6 локальных серверов, чтобы иметь возможность принимать решения с полными данными.
Каждый локальный сервер имеет компонент кэширования, который кэширует входящие запросы на основе различных параметров (местоположение, входящие параметры и т. Д.).С каждым запросом локальный сервер решает, пойти ли в базу данных (ORACLE) или получить ответ из кэша.Однако в обоих случаях локальный сервер должен перейти в базу данных, чтобы выполнить 1 вставку и 1 обновление на запрос.
ПРОБЛЕМА:
В пиковый день каждый локальный сервер получает 2000 запросов в секунду, и система начинает замедляться (ЦП: 90%).Я пытаюсь увеличить емкость, прежде чем добавить еще один локальный сервер в смесь.После выполнения некоторых тестов узким местом, как и всегда, кажется неизбежное 1 вставка и 1 обновление на запрос к базе данных.
ПРОБНЫЕ МЕТОДЫ
Чтобы уменьшить частоту, я создал службу Windows, которая находится между БД и приложением .NET.Он содержит конвейерный сервер и получает каждую вставку и обновление от основного приложения .NET и сохраняет их в Hashtable.Затем новая служба через определенные промежутки времени отправляется в базу данных один раз для выполнения пакетных вставок и обновлений.Дело было в том, чтобы ходить в базу данных реже.Хотя это имело положительный эффект, оно не принесло такой нагрузки на систему, как я ожидал.Большая часть загрузки процессора происходит от oracle.exe, так как количество запросов в секунду увеличивается.
Я стараюсь избегать как можно большего доступа к базе данных, и единственный способ избежать БД, по-видимому, заключается в увеличении коэффициента попадания в кэш, кроме упомянутого выше решения, которое я пробовал.Мой коэффициент попадания в кеш в настоящее время составляет около 81%.Поскольку каждая локальная машина имеет свой собственный кеш, я фактически пропускаю множество кешируемых запросов.Когда два одинаковых запроса перенаправляют на разные серверы, второй запрос не может получить выгоду от кэшированного результата первого.
У меня нет большого опыта в системной архитектуре, поэтому я был бы признателен за любую помощь в этой проблеме.Любые предложения по различным архитектурам кэширования или настройкам, или любые инструменты приветствуются.
Заранее спасибо, надеюсь, я прояснил свой вопрос.