Модель параллелизма в кэше роли Azure

Важно!

Корпорация Майкрософт рекомендует всем новым разработкам использовать кэш Redis для Azure. Текущую документацию и рекомендации по выбору предложения кэша Azure см. в статье о том, какое предложение кэша Azure подходит для меня?

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

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

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

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

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

Пример

В этом примере два клиента кэша (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")

'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 = _
        cacheClientB.GetCacheItem("RadioInventory")
//cacheClientA pulls the FM radio inventory from cache
DataCacheFactory clientACacheFactory = new DataCacheFactory();
DataCache cacheClientA = clientACacheFactory.GetCache("catalog");
DataCacheItem radioInventoryA = 
    cacheClientA.GetCacheItem("RadioInventory");

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

Примечание

Хотя этот пример получает сведения о версии с помощью метода 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)
//at time T1, cacheClientA updates the FM radio inventory
int newRadioInventoryA = 155;

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

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

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

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

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

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

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

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

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

Примечание

Операции объединения транзакций не поддерживаются.

Примечание

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

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

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

См. также:

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

Функции кэша роли для кэша Azure