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

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

Обновлено: Август 2015 г.

noteПримечание
Руководство по выбору правильного предложения службы кэша Azure см. в разделе Which Azure Cache offering is right for me?.

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

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

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

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

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

noteПримечание
Несмотря на то, что этот пример получает сведения о версии с помощью метода 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)

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

Во время два (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)

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

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

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

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

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

См. также

Показ:
© 2016 Microsoft