Modelos de simultaneidade (Cache do AppFabric 1.1)

A arquitetura do Microsoft AppFabric 1.1 para Windows Server permite que qualquer cliente de cache acesse abertamente todos os dados armazenados em cache se esses clientes tiverem o acesso adequado à rede e aos parâmetros de configuração. Isto representa um desafio à segurança e à simultaneidade.

Para atenuar os riscos à segurança, todos os clientes de cache, servidores de cache, e o servidor principal de fonte de dados devem ser membros do mesmo domínio, e devem ser implantados dentro do perímetro de um firewall. Também recomendamos enfaticamente que você proteja seus arquivos de configuração de aplicativos nos clientes de cache.

Para ajudar seu aplicativo a lidar com problemas de simultaneidade, o AppFabric permite o uso de modelos de simultaneidade otimista e pessimista. Para obter informações sobre os métodos disponíveis para alinhar a esses modelos, consulte Métodos de simultaneidade.

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) em dois servidores de aplicativos separados tentam atualizar o mesmo objeto em cache, que é denominado 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 diagrama e no exemplo de código a seguir.

Modelo de simultaneidade de "velocidade" em T0

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

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

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

Dica

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 diagrama e no exemplo de código a seguir.

Modelo de simultaneidade de "velocidade" em T1

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

cacheClientA.Put("RadioInventory", newRadioInventoryA, _
                 radioInventoryA.Version, "electronics")
//at time T1, cacheClientA updates the FM radio inventory
int newRadioInventoryA = 155;

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

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 cacheClientB Colocar falha. O cliente de cache gera um objeto DataCacheException com a propriedade ErrorCode definida como CacheItemVersionMismatch. Isso é ilustrado no diagrama e no exemplo de código a seguir.

Modelo de simultaneidade de "velocidade" em T2

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

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

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

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.

Dica

As operações de extensão de transações não têm suporte. O aplicativo que utiliza cache é responsável por determinar a ordem dos bloqueios e detectar deadlocks, se houver.

Aviso

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

Conceitos

Métodos de simultaneidade
Diagrama de arquitetura física de cache do AppFabric (Cache do AppFabric 1.1)
Diagrama de arquitetura lógica de cache do AppFabric (Cache do AppFabric 1.1)
Desenvolvendo um cliente de cache

  2012-03-05