Azure Functions es todavía nuevo para mí, y estoy aprendiendo sobre la marcha. Ya escribí en el blog sobre mi incursión en Azure Functions con Couchbase hace más de un mes. Justo después de publicar eso, recibí algunos comentarios útiles sobre la forma en que estaba instanciando un clúster Couchbase (y cubo).
Había asumido (erróneamente) que no había forma de guardar el estado entre llamadas a Azure Function. Esta es la razón por la que he creado un GetCluster()
que se llamaba cada vez que se ejecutaba la función. Pero, inicializar un Couchbase Grupo
es una operación cara. Cuanto menos a menudo se instancie, mejor.
Puede seguir la actualización código fuente de esta entrada de blog en Github.
Estado estático
Me costó encontrar documentación sobre si podía utilizar un estático
para reutilizarlo entre llamadas a funciones. Supongo que debería haber experimentado, como compañero MVP de Microsoft Mark Heath lo hizo. En cambio, yo planteó la pregunta a StackOverflow.
En resumen: sí. A Grupo
El valor de la función, instanciado y guardado en un miembro estático, puede reutilizarse entre llamadas a funciones. De acuerdo con el post de Mark más arriba, no hay garantía de cuánto tiempo este valor va a sobrevivir. Pero eso es una compensación esperada que haces cuando vas "sin servidor".
Inicialización perezosa en Azure Functions
Utilizar simplemente un miembro estático funcionaría, pero no es seguro para los hilos. Hay varias formas de solucionar este problema, pero una de las más sencillas y que está integrada en el framework .NET es utilizar Inicialización perezosa con Lazy
.
En primer lugar, quité el GetBucket
y GetCluster
métodos. A continuación, he creado un Perezoso
propiedad para sustituirlos.
1 2 3 4 5 6 7 8 9 10 11 |
privado estático sólo lectura Perezoso<IBucket> Cubo = nuevo Perezoso<IBucket>(() => { var uri = ConfigurationManager.AppSettings["couchbaseUri"]; var bucketName = ConfigurationManager.AppSettings["couchbaseBucketName"]; var bucketPassword = ConfigurationManager.AppSettings["couchbaseBucketPassword"]; var grupo = nuevo Grupo(nuevo ClientConfiguration { Servidores = nuevo Lista<Uri> { nuevo Uri(uri) } }); devolver grupo.OpenBucket(bucketName, bucketPassword); }); |
Acabo de hacer una sola propiedad para un cubo, ya que es todo lo que necesito para este ejemplo. Pero si usted necesita utilizar el clúster, usted puede hacer fácilmente que su propio Perezoso
propiedad. (Una vez que se dispone de un clúster, obtener un cubo es una operación relativamente barata).
Utilizar una propiedad Lazy
Al crear una instancia de Lazy
se le proporciona una lambda de inicialización. Esa lambda no se ejecutará hasta que el objeto Valor
se llama a la propiedad por primera vez.
1 2 3 4 5 6 |
var lazyObject = nuevo Perezoso<cadena>(() => { // este código no será llamado hasta que 'lazyObject.Value' sea referenciado // por primera vez devolver "¡Soy un vago!"; }); |
Por ejemplo, observe el Valor
entre Cubo
y GetAsync
en la versión actualizada de mis Azure Functions:
1 |
var doc = await Cubo.Valor.GetAsync<MiDocumento>(id); |
Si es la primera vez Valor
el cluster será inicializado. En caso contrario, se utilizará el cluster ya inicializado (pruebe a experimentar con un Guía
en lugar de Cubo
).
Resumen
El estado puede guardarse entre llamadas a Azure Function utilizando un miembro estático. Asegúrate de que es seguro para hilos (usando Lazy
o algo parecido). No hagas suposiciones sobre cuánto tiempo durará ese objeto.
¿Algo más que me haya perdido? ¿Estás usando Azure Functions con Couchbase? Me encantaría saber de ti. Por favor, deja un comentario abajo o envíame un ping a Twitter @mgroves.