Автономный режим AppFabric Cache?

Как независимый поставщик программного обеспечения я хотел бы иметь возможность программировать свой средний уровень с помощью службы кэширования AppFabric, но затем иметь возможность развертывания в небольших средах (с одним сервером) без необходимости развертывания серверов кэша AppFabric. Мне также кажется естественным, что версия клиента кеша «только в памяти» была бы идеальной для автономной разработки.

Тем не менее, все исследования, которые я провел до сих пор, подразумевают, что мне нужно загрузить настоящий кеш-сервер, чтобы заставить некоторые API работать вообще, и что текущая опция «Локальный» не соответствует требованиям для того, что я хочу.

Мне кажется, что то, что я ищу, будет работать аналогично кешу сеанса aspx, поскольку стандартный механизм находится в памяти, а затем вы можете настроить более старый внешний поставщик процессов или поставщик SQL, а теперь поставщик AppFabric, обеспечивающий все большую и лучшую масштабируемость по мере вашего продвижения. Это отлично работает для сеанса aspx.

Правильно ли я считаю, что нет эквивалентного решения для программирования и развертывания в «маленькой» среде для кэширования AppFabric?


person Mick Andrew    schedule 26.08.2011    source источник


Ответы (2)


В этом вопросе возникает ряд проблем, давайте посмотрим, сможем ли мы их решить...

Прежде всего, как Frode правильно указывает, вы можете запустить экземпляр AppFabric довольно счастливо на одном сервере - это то, что я делаю большую часть времени, играя с API. Очевидно, что функция высокой доступности не будет доступна, но, судя по самому вопросу, я думаю, вы уже приняли это.

Во-вторых, вы не можете использовать API AppFabric против локального кеша — локальный кеш существует только для того, чтобы сохранять переходы клиента AppFabric по сети на выделенный сервер кеша AppFabric.

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

Итак, давайте начнем с определения нашего интерфейса:

public interface IGenericCache
{
    void Add(string key, object value);
    void Remove(string key);
    Object Get(string key);
    void Update(string key, object value);
}

И теперь мы можем определить пару реализаций, одну с использованием MemoryCache и одну с помощью AppFabric.

using System.Runtime.Caching;

class GenericMemoryCache : IGenericCache
{
    public void Add(string key, object value)
    {
        MemoryCache cache = new MemoryCache("GenericMemoryCache");

        cache.Add(key, value, null, null);
    }

    public void Remove(string key)
    {
        MemoryCache cache = new MemoryCache("GenericMemoryCache");

        cache.Remove(key, null);
    }

    public object Get(string key)
    {
        MemoryCache cache = new MemoryCache("GenericMemoryCache");

        return cache.Get(key, null);
    }

    public void Update(string key, object value)
    {
        MemoryCache cache = new MemoryCache("GenericMemoryCache");

        cache.Set(key, value, null, null);
    }
}

using Microsoft.ApplicationServer.Caching;

class GenericAppFabricCache : IGenericCache
{
    private DataCacheFactory factory;
    private DataCache cache;

    public GenericAppFabricCache()
    {
        factory = new DataCacheFactory();
        cache = factory.GetCache("GenericAppFabricCache");
    }

    public void Add(string key, object value)
    {
        cache.Add(key, value);
    }

    public void Remove(string key)
    {
        cache.Remove(key);
    }

    public object Get(string key)
    {
        return cache.Get(key);
    }

    public void Update(string key, object value)
    {
        cache.Put(key, value);
    }
}

И мы могли бы продолжить и написать реализации IGenericCache с помощью ASP.NET Cache, NCache, memcached...

Теперь мы добавляем фабричный класс, который использует отражение для создания экземпляра одного из этих кешей на основе значений из файла app.config/web.config.

class CacheFactory
{
    private static IGenericCache cache;

    public static IGenericCache GetCache()
    {
        if (cache == null)
        {
            // Read the assembly and class names from the config file
            string assemblyName = ConfigurationManager.AppSettings["CacheAssemblyName"];
            string className = ConfigurationManager.AppSettings["CacheClassName"];

            // Load the assembly, and then instantiate the implementation of IGenericCache
            Assembly assembly = Assembly.LoadFrom(assemblyName);
            cache = (IGenericCache) assembly.CreateInstance(className);
        }
        return cache;
    }
}

Везде, где клиентский код должен использовать кеш, все, что нужно, это вызов CacheFactory.GetCache, и кеш, указанный в файле конфигурации, будет возвращен, но клиенту не нужно знать, какой это кеш, потому что клиентский код все написано против интерфейса. Это означает, что вы можете масштабировать кэширование, просто изменив настройки в файле конфигурации.

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

Отличное и более полное обсуждение программирования с использованием интерфейсов приведено в эту статью.

person PhilPursglove    schedule 12.09.2011
comment
Фил, спасибо за подробный ответ. То, что вы предлагаете, по сути, то, чего я пытался избежать, но вы подтвердили мои исследования. При реализации этого внутри IIS аспекты многопоточности усложняют реализацию, но я думаю, что .Net 4.0 ConcurrentDictionary должен помочь сделать это почти тривиально... нужно еще немного изучить. Извините за поздний ответ, я думал, что получу уведомление по электронной почте об ответах... проблема новичка! - person Mick Andrew; 04.10.2011

У нас есть одна установка, в которой мы запускаем кеш структуры приложения только на одном сервере...

person Frode Stenstrøm    schedule 27.08.2011