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 Aglomerado
O 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
.
Primeiro, removi o GetBucket
e GetCluster
métodos. Em seguida, criei um Preguiçoso
propriedade para substituí-los.
1 2 3 4 5 6 7 8 9 10 11 |
privado estático somente leitura Preguiçoso<IBucket> Balde = novo Preguiçoso<IBucket>(() => { var uri = Gerenciador de configuração.Configurações do aplicativo["couchbaseUri"]; var bucketName = Gerenciador de configuração.Configurações do aplicativo["couchbaseBucketName"]; var bucketPassword = Gerenciador de configuração.Configurações do aplicativo["couchbaseBucketPassword"]; var agrupamento = novo Aglomerado(novo Configuração de cliente { Servidores = novo Lista<Uri> { novo Uri(uri) } }); retorno agrupamento.OpenBucket(bucketName, bucketPassword); }); |
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.
1 2 3 4 5 6 |
var lazyObject = novo Preguiçoso<string>(() => { // esse código não será chamado até que 'lazyObject.Value' seja referenciado // pela primeira vez retorno "Sou preguiçoso!"; }); |
Por exemplo, observe o Valor
entre Balde
e GetAsync
na versão atualizada do meu Azure Functions:
1 |
var doc = aguardar Balde.Valor.GetAsync<MeuDocumento>(id); |
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.