Поделиться через


Модели параллелизма (кэширование в AppFabric 1.1)

Архитектура Microsoft AppFabric 1.1 для Windows Server позволяет любому клиенту кэша открыто получать доступ к любым данным кэша, если эти клиенты имеют надлежащий сетевой доступ и соответствующие параметры конфигурации. Это представляет определенные трудности как в вопросах безопасности, так и в вопросах параллелизма.

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

Чтобы помочь приложению разрешить вопросы, связанные с параллелизмом, AppFabric поддерживает оптимистичную и пессимистичную модели параллелизма. Дополнительные сведения о доступных методах выравнивая данных моделей см. в разделе Методы параллелизма.

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

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

Пример, приведенный в этом подразделе, иллюстрирует поддержку согласованности данных посредством оптимистичного параллелизма.

Пример

В этом примере два клиента кэша (cacheClientA и cacheClientB) на двух отдельных серверах приложений пытаются обновить один и тот же кэшированный объект с именем RadioInventory.

Время ноль: оба клиента получают один и тот же объект

Во время ноль (T0) оба клиента создают экземпляр класса DataCacheItem для захвата кэшированного объекта который следует обновить, вместе с дополнительными сведениями, связанными с этим кэшированным объектом, такими как версия и сведения тегов. Это показано на следующем графике и в примере кода.

Модель параллелизма Velocity в T0

'cacheClientA pulls the FM radio inventory from cache
Dim clientACacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientA As DataCache = _
        clientACacheFactory.GetCache("catalog")
Dim radioInventoryA As DataCacheItem = _
        cacheClientA.GetCacheItem("RadioInventory", "electronics")

'cacheClientB pulls the same FM radio inventory from cache
Dim clientBCacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientB As DataCache = _
       clientBCacheFactory.GetCache("catalog")
Dim radioInventoryB As DataCacheItem = _
        cacheClientA.GetCacheItem("RadioInventory", "electronics")
//cacheClientA pulls the FM radio inventory from cache
DataCacheFactory clientACacheFactory = new DataCacheFactory();
DataCache cacheClientA = clientACacheFactory.GetCache("catalog");
DataCacheItem radioInventoryA = 
    cacheClientA.GetCacheItem("RadioInventory","electronics");

//cacheClientB pulls the same FM radio inventory from cache
DataCacheFactory clientBCacheFactory = new DataCacheFactory();
DataCache cacheClientB = clientBCacheFactory.GetCache("catalog");
DataCacheItem radioInventoryB= 
    cacheClientA.GetCacheItem("RadioInventory", "electronics");

Примечание

Несмотря на то, что этот пример получает сведения о версии с помощью метода GetCacheItem для получения объекта DataCacheItem, также можно использовать метод Get для получения объекта DataCacheItemVersion, связанного с полученным элементом кэша.

Время один: первое обновление проходит успешно

Во время один (T1), cacheClientA обновляет кэшированный объект RadioInventory на новое значение. При выполнении cacheClientA метода Put версия, связанная с элементом кэша, RadioInventory, увеличивается. В это время cacheClientB имеет устаревшую версию элемента кэша. Это показано на следующем графике и в примере кода.

Модель параллелизма Velocity в T1

'at time T1, cacheClientA updates the FM radio inventory
Dim newRadioInventoryA As Integer = 155

cacheClientA.Put("RadioInventory", newRadioInventoryA, _
                 radioInventoryA.Version, "electronics")
//at time T1, cacheClientA updates the FM radio inventory
int newRadioInventoryA = 155;

cacheClientA.Put("RadioInventory", newRadioInventoryA, 
    radioInventoryA.Version,"electronics");

Время два: второе обновление завершается со сбоем

Во время два (T2) cacheClientB пытается обновить кэшированный объект RadioInventory, используя теперь уже устаревшую версию. Чтобы предотвратить перезапись изменений, внесенных cacheClientA, вызов клиентом cacheClientB метода Put завершается со сбоем. Клиент кэша вызывает объект DataCacheException со значением свойства ErrorCode, равным CacheItemVersionMismatch. Это показано на следующем графике и в примере кода.

Модель параллелизма Velocity в T2

'later, at time T2, cacheClientB tries to 
'update the FM radio inventory, throws DataCacheException with
'an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
Dim newRadioInventoryB As Integer = 130

cacheClientB.Put("RadioInventory", newRadioInventoryB, _
                 radioInventoryB.Version, "electronics")
//later, at time T2, cacheClientB tries to 
//update the FM radio inventory, throws DataCacheException with
//an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
int newRadioInventoryB = 130;

cacheClientB.Put("RadioInventory", newRadioInventoryB,
    radioInventoryB.Version,"electronics");

Пессимистичная модель параллелизма

В пессимистичной модели параллелизма клиент явно блокирует объекты для выполнения операций. Прочие операции, запрашивающие блокировку, отклоняются (система не блокирует запросы), пока блокировки не будут сняты. При блокировке объектов возвращается дескриптор блокировки в качестве выходного параметра. Дескриптор блокировки необходим для разблокирования объектов. Если клиентское приложение завершается до снятия блокировки с объекта, для снятия блокировок используются периоды ожидания. Срок действия заблокированных объектов никогда не истекает, однако этот срок тут же истекает после снятия блокировки и превышения срока действия. Дополнительные сведения о методах, использующихся при пессимистичной модели параллелизма, см. в разделе Методы параллелизма.

Примечание

Операции объединения транзакций не поддерживаются. Использующее кэш приложение несет ответственность за определение порядка блокировки и обнаружения взаимоблокировок.

Предупреждение

Заблокированные объекты в кэше могут быть заменены любым клиентом кэша с помощью метода Put. Поддерживающие кэш приложения несут ответственность за согласованное использование PutAndUnlock для элементов, использующих пессимистичную модель параллелизма.

См. также

Основные понятия

Методы параллелизма
Схема физической архитектуры кэширования AppFabric (кэширование в AppFabric 1.1)
Схема логической архитектуры кэширования AppFabric (кэширование в AppFabric 1.1)
Разработка клиента кэша

  2012-03-05