дозвуковой с поддержкой кеширования - PullRequest
1 голос
/ 11 июля 2009

Имея проект с учетом следующих требований.

  • чтение данных интенсивного применения.
  • 100 макс. Одновременных пользователей раз. Приложение имеет очень высокий трафик
  • Хотя данные огромны, они изменяются только один раз в день

Решили использовать дозвуковую причину простоты разработки и возможности работать в условиях интенсивного трафика.

Хотя немногие вещи еще не найдены / не решены для работы с SubSonic 3

  • Какой тип слоя использовать Active Records, Repository, Linq To SQL
  • работа с хранимыми процедурами подкачки / сортировки (потому что они обеспечат более высокую производительность по сравнению со встроенным механизмом подкачки при отображении более 10000 строк с разбивкой на страницы и сортировку.
  • Кэширование , с требованиями проекта это вполне понятно, требуется интенсивное использование кэширования. Но не смог найти подходящего решения, которое будет работать с дозвуком. Должен ли я создать отдельный слой для него, и если да, будет полезен короткий пример.

Ответы [ 3 ]

3 голосов
/ 11 июля 2009

Я написал класс CacheUtil для дозвукового 2.x ActiveRecord. Он основан на некотором коде, который кто-то разместил на старых дозвуковых форумах. (Это из форума, который был удален до удаления последнего форума. Вот почему форумы по программному обеспечению должны быть постоянными.) Вот пример метода поиска из кэша. Вы можете адаптировать его к SS3. Есть также вставки, fetchall, delete, clear и т. Д. Роб Коннери сказал в то время, что кэширование было проблематичным, и оно было специально исключено из ss2. Используя HttpRuntime.Cache, я разделяю кеш между веб-приложением и службой одновременно. Я считаю, что могу сделать это, так как это небольшое приложение, всегда на одном сервере.

public static RecordBase<T> Find<T, ListType>(object primaryKeyValue)
    where T: RecordBase<T>, new()
    where ListType: AbstractList<T, ListType>, new()
{
    string key = typeof(T).ToString();
    if(HttpRuntime.Cache[key] == null)
        FetchAll<T, ListType>();
    if(HttpRuntime.Cache[key] != null)
    {
        ListType collection = (ListType)HttpRuntime.Cache[key];
        foreach(T item in collection)
        {
            if(item.GetPrimaryKeyValue().Equals(primaryKeyValue))
                return item;
        }
    }
    return null;
}
1 голос
/ 01 февраля 2011

Я ответил на это аналогично здесь Поточно-ориентированные библиотеки кеша для .NET . По сути, вам нужен CollectionCacheManager - я затем добавляю слой сверху для каждого типа и направляю все запросы через эти отдельные контроллеры кэша, которые, в свою очередь, используют контроллер 1 collectioncache На внешнем слое я смешиваю чисто дозвуковое, linq, то, что соответствует всем требованиям в то время. В этом прелесть SubSonic в том, что он не должен мешать вам. Что касается сохраненной производительности процесса, я бы указал на статьи Джеффа Этвудса в CodingHorror и переосмыслил ваши сбережения. Аппаратные средства дешевы, как и память, базы данных - нет. Лично я держу базу данных очень простой и легкой, и предпочитаю, чтобы мой веб-сервер кэшировал все в памяти. Сервер баз данных выполняет очень мало работы, как мне нравится. Добавление нескольких дополнительных веб-серверов с балансировкой нагрузки - это не такая сложная задача, как увеличение пропускной способности базы данных, кластеризация или разделение базы данных. SQL & Stored Procs также может быть до смешного трудным для написания и поддержки. Возьмите тот бюджет, который вы потратили бы на это время, и вместо этого усилите свое оборудование ... Помните, что оборудование дешевое, а хорошие разработчики - нет. Удачи!

1 голос
/ 12 июля 2009

Я написал пост о том, как я использовал кеширование с SubSonic 2.x . Он не на 100% совместим с 3.x, но концепции те же.

...