Модели параллелизма (кэширование в AppFabric 1.1)
Архитектура Microsoft AppFabric 1.1 для Windows Server позволяет любому клиенту кэша открыто получать доступ к любым данным кэша, если эти клиенты имеют надлежащий сетевой доступ и соответствующие параметры конфигурации. Это представляет определенные трудности как в вопросах безопасности, так и в вопросах параллелизма.
Чтобы устранить угрозы безопасности все клиенты кэша, серверы кэша и основной сервер-источник данных должны являться членами одного домена и должны быть развернуты в пределах брандмауэра. Также настоятельно рекомендуется обеспечить безопасность файлов конфигурации приложения на клиентах кэша.
Чтобы помочь приложению разрешить вопросы, связанные с параллелизмом, AppFabric поддерживает оптимистичную и пессимистичную модели параллелизма. Дополнительные сведения о доступных методах выравнивая данных моделей см. в разделе Методы параллелизма.
Оптимистичная модель параллелизма
В оптимистичной модели параллелизма обновления кэшированных объектов не блокируются. Вместо этого при получении клиентом кэша объекта из кэша клиент также получает и сохраняет текущую версию этого объекта. При необходимости обновления клиент кэша отправляет новое значение объекта вместе с сохраненной версией объекта. Система обновляет объект только в том случае, если переданная версия совпадает с текущей версией объекта в кэше. Каждое обновления объекта изменяет номер версии, что препятствует переопределению обновления какими-либо другими изменениями.
Пример, приведенный в этом подразделе, иллюстрирует поддержку согласованности данных посредством оптимистичного параллелизма.
Пример
В этом примере два клиента кэша (cacheClientA
и cacheClientB
) на двух отдельных серверах приложений пытаются обновить один и тот же кэшированный объект с именем RadioInventory
.
Время ноль: оба клиента получают один и тот же объект
Во время ноль (T0) оба клиента создают экземпляр класса DataCacheItem для захвата кэшированного объекта который следует обновить, вместе с дополнительными сведениями, связанными с этим кэшированным объектом, такими как версия и сведения тегов. Это показано на следующем графике и в примере кода.
'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
имеет устаревшую версию элемента кэша. Это показано на следующем графике и в примере кода.
'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. Это показано на следующем графике и в примере кода.
'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