firestore - firebase functions express
Funciones en la nube para Firebase y Express (2)
No debe esperar tener ningún recurso más allá de la vida útil de una función. Debería esperar que el contenedor se limpie completamente después de que se haya resuelto la promesa final de la función o se haya enviado la respuesta HTTP por completo. No hay un estado compartido entre las invocaciones de cualquier función. Esta es la única forma en que Cloud Functions puede escalar. Si necesita un estado compartido, guárdelo en la base de datos y léalo en cada invocación, protegiéndolo con una transacción si es necesario.
No estoy seguro de lo que estás preguntando en la tercera pregunta. Parece que no tiene relación con las dos primeras preguntas, ¿tal vez debería ser su propia pregunta? Sólo hay un punto final para su backend, que yo sepa.
Los documentos de Firebase para el espacio de nombres de functions.https
muestran que la función acepta un objeto express.Request
y un objeto express.Response
. En ninguna parte se menciona que puede pasar un objeto de servidor Express a functions.https.onRequest
. Sin embargo, he encontrado que las personas han estado haciendo esto sin una indicación clara de los comentaristas de que esto no se debe hacer (excepto una persona en el subproceso del número 101 de las functions-samples
)
ver:
-
firebase-functions
https://github.com/firebase/firebase-functions/issues/27 -
functions-samples
para middleware https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js
Mis preguntas son entonces:
- ¿Cómo gestionan las funciones de nube para Firebase o las funciones de nube de GCP la vida útil de los objetos inicializados fuera de la definición de función?
- ¿Cómo afecta lo anterior a la vida útil de la función? ¿Se ejecuta hasta el tiempo de espera o funciona de manera similar a AWS Lambda?
Aclaración para 1 y 2: En Lambda, cualquier recurso fuera de la función exportada se utiliza en todas las invocaciones posteriores de la misma instancia de Lambda, mientras que la instancia de la función está "caliente". Esto significa que el tiempo de respuesta de la función no se ve afectado negativamente por ningún código de inicialización complejo que pueda tener de antemano, ya que se realiza una vez por instancia "caliente". En este ejemplo, no necesitaría inicializar un servidor ExpressJS en cada invocación, solo una vez mientras la función está "caliente". Tengo curiosidad si las Funciones en la Nube hacen lo mismo?
También en Lambda, la existencia del servidor ExpressJS no amplía el tiempo de ejecución de la función (cuando regresa está hecho), también tengo curiosidad de cómo se implementan las Funciones de la Nube aquí. ¿Simplemente hace lo mismo que Lambda, o (porque puede manejar los objetos existentes de manera diferente) hace algo más?
- La documentación de
functions.https.onRequest
no especifica que puede pasarle un objeto de servidor ExpressJS, entonces, ¿cómo funciona esto? ¿Hay entonces dos puntos finales? ¿Alguien puede explicar lo que está pasando aquí?
Aclaración para 3: He estado viendo a gente hacer lo siguiente:
// ''./functions/index.js''
var functions = require("firebase-functions");
const express = require("express");
// setup ExpressJS Server
const expressRouter = new express.Router();
expressRouter.get("*", (req, res) => {
res.send(`Hello from Express in Cloud Functions for Firebase`);
});
// Cloud Function
exports.express = functions.https.onRequest(expressRouter);
Y deseo saber cómo funciona esto dado que la API de Funciones de la Nube solo especifica la aceptación de los parámetros de functions.https.onRequest(request, response)
modelados después de la API de ExpressJS.
Estos parámetros se basan en los objetos Express Request and Response: firebase.google.com/docs/functions/http-events
Dado que todas las preguntas se refieren al fragmento único de código y este caso de uso, pensé que sería mejor responderlas juntas.
Gracias por adelantado :)
Todo esto funciona porque, de acuerdo con las coberturas, una aplicación Express es en realidad solo una función que toma una solicitud y respuesta HTTP de Node.js y actúa sobre ellas con algo de azúcar automática, como el enrutamiento. Por lo tanto, puede pasar un enrutador Express o una aplicación a un controlador de la función de la nube sin problemas, ya que los objetos de req
y res
Express son compatibles con las versiones estándar de Node.js. Básicamente, es una aplicación "doble Express" donde una aplicación está llamando a otra.
En lo que respecta al ciclo de vida de la función y al estado compartido: las funciones se activan en instancias informáticas efímeras que pueden sobrevivir para procesar múltiples solicitudes, pero pueden no. No puede ajustar o garantizar si una función se invocará o no en la misma instancia de proceso de una invocación a la siguiente.
Puede crear recursos (como una aplicación Express) fuera de la invocación de la función y se ejecutará cuando los recursos de cómputo se activen para esa función. Esto sobrevivirá mientras lo haga la instancia; sin embargo, la CPU / red se reducen a cero entre invocaciones, por lo que no puede hacer ningún "trabajo" fuera del ciclo de vida de una invocación de función. Una vez que la promesa se resuelva (o haya respondido a la solicitud HTTP), sus recursos de cómputo se reducirán mediante la limitación y se podrán finalizar en cualquier momento.