У меня есть веб-сайт, используемый сто зрителей каждый день. На одной из страниц есть таймер, который тикает каждые 10 секунд, когда он делает это, он получает последние данные из базы данных и обновляет экран.
Проблема заключается в том, что большое количество пользователей и большое количество подключений к базе данных связывают его с сервером.
Есть ли лучший способ сделать это? Обновление серверной части и всех пользователей выиграет от последних данных, но только сервер выполняет вызовы каждые 10 секунд, а не каждый пользователь?
SignalR - это то, как вы захотите. Прямо сейчас ваше приложение, вероятно, загружает страницу. Затем у вас есть jQuery, который, вероятно, устанавливает таймер на 10 секунд. Затем ваш таймер начинает, и вы, вероятно, делаете вызов ajax для получения обновленных данных, а затем помещаете эти обновленные данные в <div>
или что-то в этом роде.
Таким образом, каждые 10 секунд ваш задний конец вызывает ваш SQL-сервер, выполняя какой-то SELECT
, затем данные с SQL Server передаются на ваш сервер приложений, где вы принимаете эти данные, преобразуясь в отображаемые данные.
SignalR, с другой стороны, работает по-другому. Он использует технологию push. Технология Push работает так. Допустим, у вас сейчас 5 человек, которые посещают вашу страницу. Один человек (человек A) делает что-то, что что-то сохраняет в базе данных. Пока никто этого не видит. Но SignalR отправит сигнал всем остальным (или просто людям, в которых эта сбой базы данных влияет), в которых говорится: "Эй, новые данные доступны. Теперь вы должны обновить". Другие подключенные люди делают вызов ajax и получают обновленные данные. И альт! Остальные 4 человека теперь обновили данные на своем экране!
Надеюсь, я объяснил это достаточно ясно, чтобы вы поняли! Скотт Гензельман написал хорошее введение в SignalR.
Считаете ли вы, что ваш кеш-код на стороне сервера хранит данные за эти 10 секунд. Загрузите его и установите его на 10 секунд. Таким образом, каждый получает такую же информацию в течение 10 секунд, а затем первый после этого 10 получает новый набор данных и затем кэширует его. Таким образом, только первый человек для обновления вызывает запрос БД, остальные получают данные до 10 секунд. Что-то вроде этого:
Cache.Insert(key, data, Nothing, DateTime.Now.AddSeconds(10), TimeSpan.Zero)
Я предполагаю, что это предполагает, что пользователи получают одинаковые данные в каждом опросе. Если они все получат уникальные наборы данных, это не сократит его для вас.
Я бы использовал setInterval() для запуска функции ajax каждые 10 секунд.
window.setInterval("javascript function", milliseconds);
функция javascript будет похожа на
function GetLatest(){
$.ajax({
type: 'POST',
url: '../Services/UpdateService.asmx/GetLatest',
data: '',
contentType: "application/json; charset=utf-8",
success: function (data) {
//use the data.d to get the info passed back from webservice. then
add your logic to update your html
},
error: function () {
//catch any bad data
}
});
}
ваш фоновый метод должен выглядеть так. Объект - это то, что ваш объект
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Object GetLatest()
{
Object obj= new Object ();
obj.FirstName = "Dave";
obj.LastName = "Ward";
return obj;
}