Модель параллелизма в кэше роли 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 для элементов, использующих пессимистичную модель параллелизма.