Entender e gerenciar conexões para o serviço de cache gerenciado do Azure

Importante

A Microsoft recomenda que todos os novos desenvolvimentos usem o Cache Redis do Azure. Para obter documentação e diretrizes atuais sobre como escolher uma oferta de Cache do Azure, confira qual oferta do Cache do Azure é ideal para mim?

Os aplicativos que usam Serviço de Cache Gerenciado devem entender como as conexões são abertas ao cache de destino.

Embora Serviço de Cache Gerenciado não tenha cotas para conexões, as conexões são um recurso importante, pois podem ser um recurso caro para criar. O compartilhamento de conexões pode melhorar o desempenho.

Este tópico abrange as seguintes áreas relacionadas ao gerenciamento de conexões:

  • Pool de conexões

  • Configuração programática de pool de conexões

  • Recomendações

Pool de conexões

A forma pela qual as conexões são gerenciadas depende do estado de ativação ou desativação do pool de conexões. As seções a seguir descrevem os dois cenários possíveis e seu impacto na contabilização de conexões.

Pool de conexões ativado

A partir da versão de novembro de 2011 do SDK do Azure, todas as ofertas de cache baseadas em AppFabric de Microsoft Azure Cache têm a capacidade de agrupar conexões. Quando o pool de conexões é configurado, o mesmo pool de conexões é compartilhado para uma única instância do aplicativo cliente. O número de conexões compartilhadas é determinado pela configuração maxConnectionsToServer , que usa como padrão o número de núcleos de processador no computador cliente. O exemplo a seguir mostra como alterar essa configuração para 2 em um arquivo de configuração de aplicativo.

<dataCacheClient maxConnectionsToServer="2">

Cada instância AppDomian compartilha as conexões especificadas por maxConnectionsToServer , independentemente do número de objetos DataCacheFactory ou DataCache criados. Portanto, a fórmula para o número total de conexões ao usar o pool de conexões é o valor maxConnectionsToServer multiplicado pelo número de instâncias em execução dessa função do Azure.

O exemplo anterior pressupõe que uma única configuração de cliente de cache está sendo usada. Considere o arquivo de configuração a seguir que contém duas seções dataCacheClient nomeadas.

<dataCacheClients>
    <dataCacheClient name="default" maxConnectionsToServer="2">
      <!-- Other settings omitted for space -->
      <autoDiscover isEnabled="true" identifier="mycache.cache.windows.net" />
    </dataCacheClient>
    <dataCacheClient name="localcache" maxConnectionsToServer="3">
      <!-- Other settings omitted for space -->
      <autoDiscover isEnabled="true" identifier="mycache.cache.windows.net" />
    </dataCacheClient>
  </dataCacheClients>

Neste exemplo, o aplicativo pode criar várias instâncias DataCacheFactory ou DataCache das quais alguns usam a default configuração e alguns usam a localcache configuração. O pool de conexões está relacionado a uma única configuração. Portanto, mesmo que ambas as configurações apontem para o mesmo cache, o número total de conexões possíveis para esse cache é a soma de seus valores maxConnectionsToServer , que é 5.

Observação

Ao usar o arquivo de configuração do aplicativo, o pool de conexões é habilitado por padrão no SDK mais recente do Azure. Se você estiver configurando programaticamente o DataCacheFactoryConfiguration, o pool de conexões pode não ser habilitado por padrão e algumas ações desabilitam o pool de conexões. Consulte a seção Configuração Programática do Pooling de Conexões neste tópico.

Pool de conexões desativado

Quando o pool de conexões é desabilitado, cada objeto DataCacheFactory usa uma conexão. É importante inicializar e armazenar as instâncias do DataCacheFactory para controlar o número de conexões abertas, bem como para obter o melhor desempenho.

Quando o pool de conexões não é usado, o número de conexões estabelecidas entre o cache e um cliente é definido pela seguinte fórmula:

[DataCacheFactory instances] * [MaxConnectionsToServer setting] 

Por padrão , maxConnectionsToServer é o número de núcleos de processador no computador cliente. Você pode aumentar essa configuração para melhorar o desempenho se estiver compartilhando um objeto DataCacheFactory entre threads. Por exemplo, se maxConnectionsToServer for 2, cada objeto DataCacheFactory usará duas conexões.

Nesse cenário, vários objetos DataCacheFactory ativos usam cada um o número de conexões especificadas por maxConnectionsToServer. Por exemplo, se esse valor for 2 e houver duas instâncias de DataCacheFactory , um total de quatro conexões serão usadas.

No passado, esse era o comportamento padrão. Com o SDK mais recente, o pool de conexões é ativado por padrão se você estiver usando um arquivo de configuração de aplicativo. Para desabilitar o pool de conexões no arquivo de configuração, defina o atributo connectionPool como false. O arquivo de configuração a seguir mostra essa definição.

<dataCacheClient connectionPool="false">

O pool de conexões não será o padrão se você estiver configurando o cliente de cache programaticamente. Para obter mais informações sobre a configuração programática e o pool de conexões, consulte a próxima seção, Configuração Programática do Pooling de Conexões.

Configuração programática de pool de conexões

Quando você configura programaticamente um cliente de cache sem usar nenhuma Serviço de Cache Gerenciado configuração de configuração de configuração, o pool de conexões não é habilitado por padrão. Etapas especiais terão que ser executadas para ativar o pool de conexões no código.

  1. Crie um objeto DataCacheFactoryConfiguration . Defina as configurações padrão, como Servidores e SecurityProperties.

  2. Chame o método estático , DataCacheFactoryConfiguration. CreateNamedConfiguration, passando um novo nome de configuração, o objeto DataCacheFactoryConfiguration criado anteriormente e um sinalizador booliano que indica se o pool de conexões está habilitado(true) ou desabilitado(false).

  3. Crie um novo objeto DataCacheFactoryConfiguration , passando ao construtor o novo nome da configuração que tem o pool de conexões habilitado. Esse é o nome que você especificou na etapa anterior.

  4. Em seguida, crie um objeto DataCacheFactory que usa essa configuração.

DataCacheFactoryConfiguration Config = new DataCacheFactoryConfiguration();

// Configure the DataCacheFactoryConfiguration with appropriate settings for your cache here:
// ...

// Set the MaxConnectionsToServer to control the size of the connection pool
Config.MaxConnectionsToServer = 3;

// Create a named configuration from this configuration and enable connection pooling
DataCacheFactoryConfiguration.CreateNamedConfiguration("MyConfigWithConnectionPooling", Config, true);

// Create a DataCacheFactoryConfiguration using the new named configuration that enabled connection pooling
DataCacheFactoryConfiguration ConfigWithPooling = new DataCacheFactoryConfiguration("MyConfigWithConnectionPooling");

// Use this new named configuration in the call to DataCacheFactory
DataCacheFactory factory = new DataCacheFactory(ConfigWithPooling);

Observe que quando você cria um objeto DataCacheFactoryConfiguration , também é possível inicializar a configuração das configurações em um arquivo de configuração de aplicativo. Essa é uma abordagem combinada que usa simultaneamente o arquivo de configuração e o código para configurar o cliente de cache. Se o construtor estiver vazio, a seção de configuração "default" será lida. Se uma cadeia de caracteres for passada para o construtor, essa seção dataCacheClient nomeada será aplicada. Nesse cenário, você pode habilitar o pool de connnection do arquivo de configuração em vez de chamar a chamada CreateNamedConfiguration para fazer isso.

Aviso

Quando você inicializa o DataCacheFactoryConfiguration de um arquivo de configuração de aplicativo, as alterações feitas nessa configuração podem resultar na desabilitação do pool de conexões. Essas configurações incluem as propriedades de servidor, segurança, compactação, maxConnectionsToServer e transporte. Nesse caso, você precisaria usar o método CreateNamedConfiguration conforme descrito anteriormente para criar uma nova configuração com base na configuração modificada com o pool de conexões habilitado.

Recomendações

Com Serviço de Cache Gerenciado, não há restrições de cota em conexões diferentes dos recursos físicos subjacentes dos clientes e servidores. Entretanto, é recomendável mesmo assim usar o pool de conexões para reutilizar e gerenciar mais facilmente as conexões a fim de melhorar o desempenho.

Se o pool de conexões estiver habilitado, você deverá analisar se o valor 1maxConnectionsToServer padrão é apropriado para seu aplicativo. Se você estiver usando objetos DataCacheFactory em vários threads, é possível que você possa obter um melhor desempenho aumentando o número de conexões no pool para mais de uma. Evidentemente, você terá então que calcular como isso afeta seus requisitos totais de conexão com base no número de instâncias de função que executarão esse código.

Como foi observado, cada configuração nomeada separada recebe seu próprio pool de conexões. É essencial entender isso ao calcular o total de conexões com o cache.

É importante reconhecer as diferenças no comportamento padrão do pool de conexões quando um arquivo de configuração de aplicativo é usado e quando o cliente de cache é configurado programaticamente. Essas diferenças são descritas nas seções anteriores deste tópico. Devido à complexidade inerente à configuração programática, é mais fácil usar o pool de conexões configurando o cache por meio de arquivos de configuração (app.config ou web.config).

Com versões anteriores do SDK ou quando o pool de conexões é desabilitado manualmente, você deve criar, armazenar e reutilize uma quantidade mínima de objetos DataCacheFactory em seu código. Isso melhora o desempenho ao evitar o estabelecimento de novas conexões para cada conexão de cache. Adicionalmente, isso ajuda a gerenciar melhor o número de conexões. Novamente, se você estiver compartilhando os mesmos objetos DataCacheFactory entre threads, poderá ver um aumento de desempenho aumentando o valor maxConnectionsToServer . Quando o pool de conexões estiver desabilitado, você deverá monitorar cuidadosamente o número de objetos DataCacheFactory ativos, a configuração maxConnectionsToServer e o número de instâncias de função. Todos esses fatores se combinam para determinar o número de conexões ativas usadas.