O Azure Functions ainda é novo para mim, e estou aprendendo à medida que avanço. Escrevi em um blog sobre minha incursão no Azure Functions com o Couchbase mais de um mês atrás. Logo depois de publicar isso, recebi alguns comentários úteis sobre a maneira como eu estava instanciando um cluster (e um bucket) do Couchbase.

Eu havia assumido (erroneamente) que não havia como salvar o estado entre as chamadas do Azure Function. Foi por isso que criei um GetCluster() que era chamado toda vez que a função era executada. No entanto, a inicialização de um método do Couchbase Aglomerado é uma operação cara. Quanto menos vezes você o instanciar, melhor.

Você pode acompanhar a atualização do código-fonte para esta postagem de blog no Github.

Estado estático

Tive dificuldade em encontrar documentação sobre a possibilidade de usar um estático para reutilização entre chamadas de função. Suponho que eu deveria ter feito experimentos, como colega Microsoft MVP Mark Heath fez. Em vez disso, eu fez a pergunta ao StackOverflow.

Em resumo: sim. A AglomeradoO valor de um valor, instanciado e salvo em um membro estático, pode ser reutilizado entre chamadas de função. De acordo com a postagem de Mark acima, não há garantia de quanto tempo esse valor sobreviverá. Mas essa é uma troca esperada que você faz ao adotar a abordagem "sem servidor".

Inicialização preguiçosa no Azure Functions

O simples uso de um membro estático funcionaria, mas não é seguro para threads. Há algumas maneiras de resolver esse problema, mas uma maneira fácil que está incorporada diretamente na estrutura do .NET é usar Inicialização preguiçosa com Preguiçoso.

Lazy Initialization in Azure Functions

Primeiro, removi o GetBucket e GetCluster métodos. Em seguida, criei um Preguiçoso propriedade para substituí-los.

Criei apenas uma única propriedade para um bucket, pois é tudo de que preciso para este exemplo. Mas se você precisar usar o cluster, poderá facilmente criar sua própria propriedade Preguiçoso propriedade. (Quando você tem um cluster, obter um bucket é uma operação relativamente barata).

Usando uma propriedade Lazy

Quando você instanciar um Preguiçoso você o fornece com um lambda de inicialização. Esse lambda não será executado até que o objeto Valor é de fato chamada pela primeira vez.

Por exemplo, observe o Valor entre Balde e GetAsync na versão atualizada do meu Azure Functions:

Se essa for a primeira vez Valor for usado, o cluster será inicializado. Caso contrário, ele usará o cluster já inicializado (tente experimentar com um Guia em vez de um Balde).

Resumo

O estado pode ser salvo entre as chamadas da Função do Azure usando um membro estático. Certifique-se de que ele seja thread-safe (usando Preguiçoso ou algo do gênero). Não faça nenhuma suposição sobre quanto tempo esse objeto permanecerá no local.

Mais alguma coisa que eu tenha perdido? Você está usando o Azure Functions com o Couchbase? Gostaria muito de ouvir sua opinião. Por favor, deixe um comentário abaixo ou me envie um ping em Twitter @mgroves.

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.

Deixar uma resposta