Exportar (0) Imprimir
Expandir Tudo

Modelo de simultaneidade (cache em função para Azure Cache)

Atualizado: fevereiro de 2014

A arquitetura do caching permite que qualquer cliente de cache acesse todos os dados armazenados em cache se esses clientes tiverem o acesso à rede e definições de configuração adequados. Isso representa um desafio à simultaneidade.

Para ajudar seu aplicativo a lidar com problemas de simultaneidade, são suportados modelos de simultaneidade otimista e pessimista.

Modelo de simultaneidade otimista

No modelo de simultaneidade otimista, faça a atualização para que os objetos de cache não usem bloqueios. Em vez disso, quando o cliente de cache recebe um objeto de cache, ele também obtém e armazena a versão atual do objeto. Quando uma atualização for necessária, o cliente de cache envia o novo valor do objeto junto com a versão armazenada do objeto. O sistema só atualiza o objeto se a versão enviada corresponder à versão atual do objeto no cache. Cada atualização de um objeto muda seu número de versão, impedindo que a atualização substitua as alterações realizadas por outra pessoa.

O exemplo neste tópico mostra como a simultaneidade otimista mantém a uniformidade dos dados.

Exemplo

Neste exemplo, dois clientes de cache (cacheClientA e cacheClientB) tentam atualizar o mesmo objeto em cache, com a mesma chave RadioInventory.

Tempo Zero: Ambos os clientes acessam o mesmo objeto

No tempo zero (T0), ambos os clientes de cache instanciam uma classe DataCacheItem para capturar o objeto em cache que pretendem atualizar, junto com outras informações associadas a esse objeto em cache, como as informações de versão e marca. Isso é ilustrado no seguinte exemplo de código.

'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")

noteObservação
Embora este exemplo obtenha as informações de versão usando o método GetCacheItem para acessar o objeto DataCacheItem também é possível usar o método Get para obter o objeto DataCacheItemVersion associado ao item acessado no cache.

Tempo Um: A Primeira Atualização É Bem-Sucedida

No tempo um (T1), cacheClientA atualiza o objeto em cache RadioInventory com um novo valor. Quando cacheClientA executa o método Colocar, a versão associada ao item de cache RadioInventory é incrementada. Neste momento, cacheClientB tem um item de cache desatualizado. Isso é ilustrado no seguinte exemplo:

'at time T1, cacheClientA updates the FM radio inventory
Dim newRadioInventoryA As Integer = 155

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

Tempo Dois: A Segunda Atualização Falha

No tempo dois (T2), cacheClientB tenta atualizar o objeto RadioInventory no cache, usando o que agora é um número desatualizado de versão. Para evitar que as alterações de cacheClientA sejam substituídas, a chamada ao método cacheClientBColocar falha. O cliente de cache gera um objeto DataCacheException com a propriedade ErrorCode definida como CacheItemVersionMismatch. Isso é ilustrado no seguinte exemplo de código.

'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)

Modelo de simultaneidade pessimista

No modelo de simultaneidade pessimista, o cliente bloqueia explicitamente os objetos para que eles não realizem operações. As outras operações que solicitam bloqueios também serão rejeitadas (o sistema não bloqueia solicitações) até que os bloqueios sejam liberados. Quando os objetos estão bloqueados, uma alça de bloqueio é retornada como um parâmetro de saída. A alça de bloqueio é necessária para desbloquear o objeto. Caso o aplicativo cliente termine antes de liberar um objeto bloqueado, há limites de tempo para liberar os bloqueios. Os objetos bloqueados nunca expiram, mas eles poderão expirar imediatamente após o desbloqueio se ultrapassarem a data de vencimento.

Para obter mais informações sobre os métodos utilizados com o modelo de simultaneidade pessimista, consulte Métodos de simultaneidade

noteObservação
As operações de extensão de transações não têm suporte.

noteObservação
O aplicativo que utiliza cache é responsável por determinar a ordem dos bloqueios e detectar deadlocks, se houver.

WarningAviso
Os objetos bloqueados no cache ainda podem ser substituídos por qualquer cliente de cache com o método Colocar. Os aplicativos habilitados por cache são responsáveis pela utilização consistente de PutAndUnlock para itens que usam o modelo de simultaneidade pessimista.

Consulte também

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft