Feel Good.
Показаны сообщения с ярлыком cache. Показать все сообщения
Показаны сообщения с ярлыком cache. Показать все сообщения

10 марта 2011

Caching в WCF сервисе

Кэширование данных неотъемлемая часть высоконагруженных и ресурсоемких проектов. В этой статье я опишу процесс организации оптимального механизма кэширования в WCF сервисе. Сформулирую задачу: имея WCF сервис, нужно организовать кеширование результатов работы любого сервис-метода в зависимости от входных параметров (Caching Support for WCF Services). Существует множество решений поставленной задачи, и самое простое и очевидное, это организовать кэширование прямо в сервис-методе:

public DateTime GetDate()

{

    ICache cache = ...; // получим экземпляр кэша

 

    string key = "somekey";

    object value;

 

    // Попробуем достать данные из кэша

    if (!cache.TryGet(key, out value))

    {

        // Данные в кэше отсутствуют,

        // получим новые данные

        value = DateTime.Now;

        // и поместим их в кэш на 5 секунд

        cache.Add(key, value, TimeSpan.FromSeconds(5));

    }

    return (DateTime)value;

}


Из примера видно, что сервис-метод GetDate перегружен логикой кэширования, и с появлением еще одного аналогичного сервис-метода, логика кэширования будет просто скопирована в него. Очевидно, что такой подход приведет к тому, что со временем такой код станет труднее поддерживать при изменении схемы кэширования, и естественно возникает вопрос об организации функционала сквозного кэширования. Организовать такую функциональность можно через AOP или в случае с WCF можно воспользоваться стандартным механизмом перехвата вызова через специальные интерфейсы (WCF Interceptor Interfaces), а точнее через интерфейс IOperationInvoker.
И, предже чем приступить к реализации наметим основные шаги:
  1. Для начала создадим простой WCF сервис
  2. Объявим интерфейс кэша ICache
  3. Реализуем свой перехватчик (IOperationInvoker)
  4. И закончим реализацией IOperationBehavior атрибута для нашего перехватчика

17 ноября 2010

False sharing

Казалось бы, зачем задумывываться о процессах, происходящих на таком низком уровне, как кэширование данных в L1 и L2 кешах (L1, L2 cache), если Вы программируете под .NET. Очевидно для повышения быстродействия программы (perfomance) за счет уменьшения кэш-промахов (Cache Miss). Самый простой и классический пример демонстрирующий проблему Cache Miss, это "неправильный" обход массива. При "правильном" обходе количество промахов будет минимально, следовательно участок кода выполнится быстрее:

int size = 10000;

int[,] matrix = new int[size, size];

 

// Вариант 1

// Очень медленный вариант

for (int col = 0; col < size; col++)

    for (int row = 0; row < size; row++)

        matrix[row, col] = 0;

 

// Вариант 2

// Быстрый вариант

for (int row = 0; row < size; row++)

    for (int col = 0; col < size; col++)

        matrix[row, col] = 0;