Продажи: 1-800-867-1389

Модель параллелизма для управляемой службы кэша Azure

Обновлено: Сентябрь 2014 г.

noteПримечание
Руководство по выбору правильного предложения службы кэша Azure см. в разделе Какой кэш Azure подходит мне лучше всего?.

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

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

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

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

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

Нулевое время: оба клиента извлекают один и тот же объект

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

//cacheClientA pulls the FM radio inventory from cache
string strACSKey = "[Authentication token]";
DataCacheSecurity clientAFactorySecurity = new DataCacheSecurity(strAcsKey);

DataCacheFactoryConfiguration clientAFactoryConfiguration = new DataCacheFactoryConfiguration();
// Set up desired parameters for Cache Factory
clientAFactoryConfiguration.SecurityProperties = clientAFactorySecurityDataCacheFactory;

clientACacheFactory = new DataCacheFactory(clientAFactoryConfiguration);
DataCache cacheClientA = clientACacheFactory.GetCache("catalog");
DataCacheItem radioInventoryA = 
    cacheClientA.GetCacheItem("RadioInventory");

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

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

Первое время: первое обновление завершается успешно

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

//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.
int newRadioInventoryB = 130;

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

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

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

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

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

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

См. также

Была ли вам полезна эта информация?
(1500 символов осталось)
Спасибо за ваш отзыв
Показ:
© 2015 Microsoft