.NET

Armazenamento em cache distribuído com ASP.NET Core e Couchbase

O armazenamento em cache distribuído pode ajudar a melhorar o desempenho de um aplicativo ASP.NET Core. Isso é especialmente verdadeiro para um aplicativo ASP.NET que é implantado em um farm de servidores ou em um ambiente de nuvem escalável. Usar o Couchbase Server para armazenamento em cache é um dos muitos recursos que o tornam a escolha ideal para seu aplicativo ASP.NET Core. necessidades do banco de dados de engajamento.

Nesta postagem do blog, mostrarei a você como usar o Plug-in do middleware Couchbase.Extensions.Caching para adicionar facilmente recursos de cache distribuído ao seu aplicativo.

Observe que o Couchbase.Extensions.Caching está atualmente em uma versão beta2 (no momento em que escrevo esta postagem do blog), portanto, algumas coisas podem mudar.

Configuração básica do Couchbase

Primeiro, você precisará de um cluster do Couchbase Server em execução (você pode instalá-lo no localou com o Dockerou mesmo no Azure se você quiser).

Em seguida, você precisará criar um balde no Couchbase onde os dados armazenados em cache serão armazenados. Chamei o meu de "cachebucket". Talvez você queira aproveitar as vantagens do novo recurso de balde efêmero no Couchbase Server 5.0 para armazenamento em cache, mas não é necessário.

Se você estiver usando o Couchbase Server 5.0, também precisará criar um usuário com permissões (Data Writer e Data Reader) nesse bucket. Para manter as coisas simples, crie um usuário com o mesmo nome do bucket (por exemplo, "cachebucket").

Cache distribuído com o Couchbase.Extensions

O Couchbase.Extensions (GitHub) tem como objetivo tornar mais simples o trabalho com o Couchbase Server e o .NET Core. O armazenamento em cache é apenas uma dessas extensões.

Você pode adicioná-lo ao seu projeto ASP.NET Core com o NuGet, por meio do Package Manager: Instalar o pacote Couchbase.Extensions.Caching -Versão 1.0.0-beta2ou com a interface do usuário do NuGet, ou você pode usar a linha de comando do .NET: dotnet add pacote Couchbase.Extensions.Caching --versão 1.0.0-beta2.

Couchbase extension for distributed caching available on NuGet

Depois de adicionar isso ao seu projeto, você precisará fazer algumas pequenas alterações em seu Inicialização classe em Startup.cs.

Primeiro, em ConfigureServicesAdicione alguns namespaces:

Isso tornará o namespace Caching disponível e, especificamente, o namespace AddDistributedCouchbaseCache método de extensão para IServiceCollection. Em seguida, chame esse método de extensão de dentro do ConfigureServices método.

O outro espaço de nome lá dentro, Injeção de dependênciaé necessário para injetar a funcionalidade do Couchbase. Nesse caso, ela será usada somente pela extensão Caching. Mas você também pode usá-la para outras finalidades, que abordarei em uma postagem futura no blog.

Mas, por enquanto, ele só é necessário para o AddCouchbase método de extensão em IServiceCollection.

Por fim, junte os dois, e seu ConfigureServices deve ter a seguinte aparência:

Uso de cache distribuído

Agora que você tem uma configuração de cache distribuído com o Couchbase em seu projeto ASP.NET Core, pode usar IDistributedCache em outra parte do seu projeto.

Injeção de IDistributedCache

Um exemplo simples seria usá-lo diretamente em um controlador. Ele pode ser injetado em construtores conforme sua necessidade:

Cache de strings

Você pode usar o GetString e SetString para recuperar/definir um valor de string no cache.

Isso apareceria no bucket "cachebucket" como um valor binário codificado (não JSON).

String cached in Couchbase

No código de exemplo, eu simplesmente imprimo o ViewData["Message"] na visualização do Razor. A aparência deve ser semelhante a esta:

Cached string output to Razor

Objetos em cache

Você também pode usar Set e Obter para salvar e recuperar objetos no cache. Criei um POCO (Plain Old CLR Object) muito simples para demonstrar:

Em seguida, na amostra, eu gero uma string aleatória para usar como uma chave de cache e uma instância gerada aleatoriamente de MyPoco. Primeiro, eu os armazeno no cache usando o Set método:

Em seguida, imprimo a chave para a visualização do Razor:

Cached POCO output to Razor

Em seguida, posso usar essa chave para procurar o valor no Couchbase:

Cached POCO in Couchbase

Além disso, observe que ele foi serializado para JSON. Isso não significa apenas que você pode lê-lo, mas também pode consultá-lo com o N1QL (se necessário).

Cache distribuído com expiração

Se quiser que os valores no cache expirem após um determinado período de tempo, você pode especificar isso com DistributedCacheEntryOptions (somente SlidingExpiration é suportado no momento).

No projeto de amostra, também configurei isso para ser impresso no Razor.

Cached POCO with expiration

Se você visualizar esse documento (antes que os 10 segundos se esgotem) no Console do Couchbase, verá que ele tem um expiração em seus metadados. Veja um exemplo:

Após 10 segundos, esse documento desaparecerá do compartimento e você verá um erro "not found (Document does not exist)" (não encontrado (o documento não existe)).

Eliminação do cache distribuído

Por fim, não se esqueça de limpar os recursos usados pelo Couchbase .NET SDK para o armazenamento em cache distribuído. Uma maneira fácil de fazer isso é com o comando ApplicationStopped evento. Você pode conectar isso em Inicialização:

Observe que você terá que adicionar IApplicationLifetime appLifetime como um parâmetro para o Configurar método em Inicialização se você ainda não o fez.

Resumo

Usar o Couchbase Server para armazenamento em cache distribuído em seu aplicativo ASP.NET Core é uma ótima maneira de melhorar o desempenho e a escalabilidade do seu aplicativo. Esse tipo de caso de uso de "engajamento" é o que o Couchbase Server faz de melhor. Para ver os clientes que estão usando o Couchbase Server para armazenamento em cache, confira a página Clientes do Couchbase página.

Se você tiver perguntas ou comentários sobre o projeto Couchbase.Extensions.Caching, não deixe de conferir a seção Repositório do GitHub ou o Fóruns do SDK do Couchbase .NET.

Como sempre, você pode entrar em contato comigo deixando um comentário abaixo ou encontrando-me em Twitter @mgroves.

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Matthew Groves

Matthew D. Groves é um cara que adora programar. Não importa se é C#, jQuery ou PHP: ele enviará solicitações de pull para qualquer coisa. Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90. Atualmente, ele trabalha como gerente sênior de marketing de produtos da Couchbase. Seu tempo livre é passado com a família, assistindo aos Reds e participando da comunidade de desenvolvedores. Ele é autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP.

3 Comentários

  1. Mathew,

    Este foi um bom artigo sobre como começar a usar o couchebase. Tentei fazer o download do servidor couchebase localmente para estudar e consegui implementar o cache em um aplicativo dotnet core usando o middleware fornecido. O único problema que tenho no momento é com a versão mais antiga do couchebase em meu local de trabalho. Acontece que eles têm um servidor couchebase antigo que não tem segurança protegida por senha no nível do bucket e, quando estou tentando
    services.AddCouchbase(opt =>
    {
    opt.Servers = new List
    {
    novo Uri("http://myworkplacecouchebasehostname:8091")
    };
    });
    //não há senha para o bucket, então se
    services.AddDistributedCouchbaseCache("bucketname", opt => {});

    Recebo o seguinte erro com o stacktrace. Você pode me indicar a direção correta do que estou perdendo aqui?
    Ocorreu uma exceção não tratada durante o processamento da solicitação.
    BootstrapException: Não foi possível fazer o bootstrap - verifique as exceções internas para obter detalhes. (A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) (Não foi possível fazer o bootstrap com CCCP. (A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond)) (Após o bootstrapping, a lista de nós tem zero elementos, indicando que o cliente falhou durante o bootstrapping. Verifique os registros do cliente para obter mais informações sobre o motivo da falha).
    Couchbase.Core.ClusterController.CreateBucketImpl(string bucketName, string password, IAuthenticator authenticator)

    SocketException: Uma tentativa de conexão falhou porque a parte conectada não respondeu adequadamente após um período de tempo, ou a conexão estabelecida falhou porque o host conectado não respondeu
    Couchbase.IO.DefaultConnectionFactory+c__0.b__0_0(IConnectionPool p, IByteConverter c, BufferAllocator b)

    CouchbaseBootstrapException: Após o bootstrapping, a lista de nós tem zero elementos, indicando que o cliente falhou durante o bootstrapping. Verifique os logs do cliente para obter mais informações sobre o motivo da falha.
    Couchbase.Configuration.CouchbaseConfigContext.UpdateServices(Dictionary servers)

    SocketException: Uma tentativa de conexão falhou porque a parte conectada não respondeu adequadamente após um período de tempo, ou a conexão estabelecida falhou porque o host conectado não respondeu
    Couchbase.IO.DefaultConnectionFactory+c__0.b__0_0(IConnectionPool p, IByteConverter c, BufferAllocator b)

    1. Oi zysed,

      Recomendo que você publique essa pergunta nos fóruns do .NET: https://forums.couchbase.com/c/net-sdk ou possivelmente como um problema na biblioteca de extensões: https://github.com/couchbaselabs/Couchbase.Extensions

      Provavelmente há uma solução alternativa, e postar nesses lugares fará com que mais pessoas vejam o problema do que apenas eu.

      Recomendo enfaticamente que você coloque uma senha em seu bucket ou atualize para uma versão mais recente do Couchbase Server (onde não é mais possível ter um bucket sem senha). Mesmo que seu servidor esteja protegido por um firewall, ainda é perigoso deixá-lo completamente desprotegido. Além disso, uma versão tão antiga do Couchbase provavelmente deixará de receber versões de correção de bugs (se é que já não recebeu).

  2. Obrigado, Matthew. Também concordo plenamente. Mais uma vez, continue escrevendo bons artigos como este, pois eles são muito úteis.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.