DAL, сеанс, архитектура кэша

Я пытаюсь создать уровень доступа к данным для своего веб-приложения. В настоящее время все таблицы данных хранятся в сеансе. Когда я закончу, DAL заполнит и вернет таблицы данных. Стоит ли хранить возвращенные таблицы данных в сеансе? Распределенный/общий кеш? Или просто пинговать базу данных каждый раз? Примечание: обычно количество строк в таблице данных будет небольшим ‹ 2000.

Дополнительная информация:

Практически никакие данные не разглашаются. Параметры, которые отправляются в SQL-запросы, выбираются пользователем. Значения параметров, доступные пользователю, зависят от того, кем является пользователь. В большинстве случаев два пользователя не могут выполнять одни и те же SQL-запросы. Однако один и тот же пользователь может выполнять один и тот же запрос несколько раз.

Дополнительная информация: количество одновременных пользователей ~50 000

Важная информация. В 99 % случаев у двух пользователей не будет одинаковых данных/запросов, однако один и тот же пользователь может запускать один и тот же запрос/получать одни и те же данные несколько раз.

Спасибо


person O.O    schedule 21.04.2010    source источник


Ответы (4)


Хранение данных в сеансе не является хорошей идеей, потому что:

  1. Каждый пользователь получает отдельную копию одних и тех же данных — огромная трата серверной памяти.
  2. IIS перезапустит сеанс, если вы заполните его слишком большим объемом данных.

Я рекомендую хранить таблицы данных в кеше. , а также заполнение каждой таблицы только при первом запросе, а не все сразу. Таким образом, если IIS начнет освобождать место в кеше, ваш код не пострадает.

Очень простой пример получения по запросу:

T GetCached<T>(string cacheKey, Func<T> getDirect) {
    object value = HttpContext.Current.Cache.Item(cacheKey);
    if(value == null) {
        value = getDirect();
        HttpContext.Current.Cache.Insert(cacheKey, value);
    }
    return (T) value;
}

EDIT: — Обновление вопроса

Кэш против локального сеанса. Состояние локального сеанса — «все или ничего». Если он переполнится, IIS переработает все в нем. Напротив, элементы кеша удаляются по отдельности, когда памяти становится слишком мало, поэтому это гораздо меньшая проблема.

Кэш против сервера состояния сеанса — у меня нет данных для резервного копирования, поэтому, пожалуйста, скажите об этом, если я ошибаюсь, но я бы подумал, что кэширование данных независимо в памяти в каждом физическом сервере AppDomain будет лучше масштабироваться чем хранить его в общей службе состояния сеанса.

person Christian Hayter    schedule 21.04.2010
comment
1. Практически ни один пользователь не получит одинаковые данные. 2. HttpCache не работает более чем с одним сервером. Тем не менее, эта концепция кажется хорошей идеей при использовании с Velocity или чем-то подобным. - person O.O; 21.04.2010
comment
Размер кеша должен быть относительно небольшим, я не думаю, что 50 000 пользователей с несколькими таблицами данных в кеше будут жизнеспособными. - person Joe Ratzer; 21.04.2010
comment
@Джо: Верно. Я предполагаю, что лучше всего для начала не кэшировать никаких данных, а затем профилировать приложение, чтобы увидеть, какие таблицы больше всего выиграют от кэширования. - person Christian Hayter; 21.04.2010
comment
Ну, один и тот же пользователь может запускать один и тот же запрос несколько раз. то есть они запускают запрос, переключаются на другую страницу/вкладку, запускают запрос, а затем переключаются обратно и запускают тот же запрос. - person O.O; 21.04.2010

Первое, что я хотел бы сказать: кеш не везде обязателен. Вы должны использовать его с умом и специально для узких мест, связанных с доступом к данным.

Я не думаю, что это хорошая идея хранить 1000 различных таблиц данных с 2000 записями в любом месте. Если запросы настолько динамичны, что один и тот же запрос за короткий промежуток времени является исключением, то кеширование не кажется хорошим вариантом.

Что касается опции распределенного кэша, я предлагаю вам проверить http://memcached.org . Распределенный кеш, используемый многими крупными проектами по всему миру.

Я знаю, что скоро Velocity, но пока я знаю, что ему нужна Windows Server 2008, и это пока что-то очень новое. Обычно продукты Microsoft хороши с версии 2.0 :-)

person Claudio Redi    schedule 21.04.2010
comment
Я смотрел SharedCache. Memcached выглядел совсем не похоже на .NET - person O.O; 21.04.2010
comment
Существует клиент для .NET sourceforge.net/projects/memcacheddotnet . Его можно использовать в совершенстве из .NET :-) - person Claudio Redi; 21.04.2010
comment
AppFabric/Velocity будет выпущен к концу июня. - person PhilPursglove; 22.04.2010

Храните справочники/словари и элементы, которые очень часто требуются вашему приложению в объекте Application или Cache; запрашивать базу данных для данных, которые зависят от роли пользователя.

--ИЗМЕНИТЬ--

Это ответ на ваш комментарий.

Обычно в любой системе, ориентированной на данные, запросы выполняются вокруг таблицы фактов (или таблиц, которые неизбежно запрашиваются); если у вас есть набор неизбежных таблиц, поэтому вы можете использовать Cache.Insert():

  1. Загружать неизбежные таблицы при запуске приложения;
  2. Загружать большинство запрашиваемых таблиц в кэш по запросу таблицы;
  3. База данных запросов для наименее запрашиваемых таблиц.

Если у вас нет проблем с производительностью, пусть SQL справится со всем.

person KMån    schedule 21.04.2010
comment
Не будет ли это слишком много данных для кэша? - person O.O; 22.04.2010
comment
@ subtl3: Ну, это действительно зависит от количества данных, которые у вас есть. Принимая во внимание Note: generally the number of rows in the datatable will be small < 2000 и ваши ограничения по производительности... Я считаю, что Cache - ваш лучший выбор; даже если вы рассмотрите объект Application, он не будет поддерживать функциональность истечения срока действия, что необходимо в вашем случае. - person KMån; 22.04.2010

Хранить такое количество данных в Session — очень плохая идея. Каждый пользователь получит свою версию!

Если это общие данные (одинаковые для всех пользователей), рассмотрите возможность их перемещения в объект Application.

person Oded    schedule 21.04.2010
comment
Практически никакие данные не разглашаются. Параметры, которые отправляются в SQL-запросы, выбираются пользователем. Значения параметров, доступные пользователю, зависят от того, кем является пользователь. В большинстве случаев два пользователя не могут выполнять одни и те же SQL-запросы. Однако, если один и тот же пользователь запускает один и тот же sql более одного раза, не имеет ли смысл избегать этого? - person O.O; 21.04.2010
comment
Сколько у вас будет пользователей? Если не так много одновременных пользователей, позвольте SQL управлять проблемами параллелизма. Оптимизируйте, когда вам необходимо, а не раньше. - person Oded; 21.04.2010
comment
Не менее 50 000 одновременных пользователей - person O.O; 21.04.2010
comment
Как часто повторяются запросы? Хотя бы пару раз, вы могли бы также позволить SQL справиться с этим. - person Oded; 21.04.2010
comment
Неизвестный. Это зависит от пользователя. Я собираюсь поспорить больше, чем пара - person O.O; 21.04.2010
comment
Какие реальные проблемы с производительностью вы видите? При использовании сеансов я ожидаю, что веб-сервер довольно быстро исчерпает память. - person Oded; 21.04.2010
comment
На данный момент проблем с производительностью нет, так как приложение находится в стадии разработки. Один пользователь. - person O.O; 21.04.2010