Firebase Cloud Functions: lo bueno, lo meh y lo feo

Cuando revisé Firebase el año pasado, me quejé de que no era completamente sin servidor. Todavía se necesitaba un servidor de nodo para funciones comunes, como enviar correos electrónicos o crear miniaturas.

Firebase Cloud Functions se anunció unos meses después. El servicio todavía está en versión beta, pero lo he estado usando felizmente durante un par de meses en producción.

Veamos cómo le va.

¿Qué son las funciones de Firebase Cloud?

Si nunca antes ha oído hablar de las funciones en la nube, el concepto es bastante sencillo. Implemente una lógica concisa en un servidor en forma de funciones y algunos elfos diligentes pueden ser invocados mágicamente desde el limbo para hacer una tarea por usted. Todo esto sin preocuparse por la infraestructura y pagando solo por los recursos de ejecución.

En muchos casos, este nuevo paradigma puede simplificar la escritura, el mantenimiento y la ejecución del código backend.

Las funciones de Firebase Cloud Functions en particular son como bloques de Lego que puedes conectar a cualquier servicio de Firebase. Por ejemplo, se puede activar una función cuando se carga una imagen en Firebase Storage para crear una miniatura, o tal vez limpiar algunos datos del usuario cuando se elimina un nodo en Realtime Database. Prácticamente cualquier cosa de interés que suceda en Firebase puede activar una función.

Si eso no es suficiente, también puede usar HTTP para activar funciones con GET, POST, etc. Vea este increíble video sobre cómo combinar Firebase Hosting con Cloud Functions para crear una aplicación Express completa:

El gran

La infraestructura no puede ser más fácil que esto

La infraestructura se extrae completamente de ti, al igual que el resto de Firebase. Cada vez que se activa una función, un nuevo servidor virtual cobra vida, hace su trabajo y vuelve al limbo. La magia de Google Cloud seguirá activando sus funciones y escalando la infraestructura de acuerdo con la carga de trabajo automáticamente.

Precios

Las funciones de la nube en general son muy rentables. Es difícil comparar los precios de los proveedores de la nube, pero puedo decir que, según mi experiencia, Firebase Cloud Functions ha sido ridículamente barato. Es difícil creer que Google esté ganando dinero con esto.

Fácil de usar

Como es habitual con Firebase y Google, los documentos son geniales y no hará acrobacias mentales para obtenerlos . También hay toneladas de muestras en Github para comenzar. La autenticación de la implementación es manejada por Firebase CLI, por lo que poner en marcha un Hola mundo es literalmente:

firebase init functionsfirebase deploy

Creo que la simplicidad de usar Firebase y Google Cloud en general es simplemente increíble, especialmente en comparación con la competencia.

Flexible

Como escribí antes, estas funciones pueden ser activadas por todo tipo de eventos. Apuesto a que no se quedarán sin ideas sobre cómo integrarlas con su proyecto de Firebase o incluso con el resto de su pila.

Estos son algunos de los problemas que hemos resuelto con Firebase Cloud Functions:

  • Genere archivos PDF para un servicio de facturación en línea utilizando Phantom.js y firme estas facturas con algún servicio gubernamental
  • Conectar un servicio Go con un proveedor de SOAP externo (ugh)
  • Envíe correos electrónicos a través de HTTP desde cualquier lugar de nuestra pila

El Meh

Arranques en frío

La escalabilidad es excelente, pero el tiempo de ejecución puede fluctuar enormemente. Una función simple de hola mundo puede tardar 3 ms en hacer su trabajo, o 100 ms.

functions.https.onRequest((request, response) => { response.send(“Hello from Firebase!”);});

Estas fluctuaciones se deben a los tiempos de arranque del servidor virtual. Si el servidor virtual que ejecuta su función está activo, la función se activará instantáneamente. Pero si el servidor tiene que salir del limbo, obviamente necesitará más tiempo para comenzar a funcionar. En la jerga de las funciones de nube, esto se conoce como arranques en caliente y en frío.

En la práctica, no puede confiar en tiempos de respuesta consistentes a menos que esté almacenando en caché sus datos, como se describe en el video anterior, o use trucos para mantener sus funciones calientes.

Desafortunadamente, los arranques en frío son un aspecto inevitable de lidiar con las funciones de la nube (de cualquier proveedor). Tendrá que tenerlo en cuenta al decidir utilizar una función en la nube para resolver algo.

Sin programador (cron)

Las funciones en la nube son perfectas para realizar tareas de poco tráfico, como generar informes o hacer copias de seguridad periódicas a las 2 a.m., pero con Firebase o Google Cloud no hay una manera fácil de activar sus funciones según un horario.

El equipo de Firebase recomienda crear un proyecto de App Engine para orquestar estos activadores. El servicio realmente pide algo como el Programador de Heroku.

JavaScript solo

Eh, estoy de acuerdo con JavaScript, pero tanto Azure como AWS admiten muchos más idiomas. Es irónico que Google no admita Go en su servicio de función en la nube, pero AWS sí.

Nodo 6

Una vez más, la competencia está mejorando. Tanto AWS Lambda como Azure Functions ya se están ejecutando en el nodo 8. El mayor inconveniente aquí es volver a las promesas sin async / await o tener que configurar Babel en su proyecto.

El feo

Flujo de trabajo de desarrollo

Con la excepción de las funciones activadas por HTTP, no puede ejecutar sus funciones localmente. Las funciones activadas por un servicio de Firebase deben implementarse en la nube.

Esto tiene muchas implicaciones desagradables:

  • Los pequeños errores acaban costando mucho tiempo, ya que las nuevas funciones tardan un par de minutos en empezar a funcionar.
  • Las funciones implementadas no tienen versiones obvias. Todos los registros de la misma función parecen ser de la misma versión. Nunca está claro cuándo están funcionando realmente las nuevas funciones, por lo que su única opción es activar manualmente las funciones y See-What-Happens ™.
  • Sin retrocesos

Ambientes

Además de los puntos anteriores, la gestión de entornos es ... complicada.

Puede agregar variables de entorno a sus proyectos de funciones con Firebase CLI pero, al igual que otros aspectos de Firebase, este es un enfoque ingenuo que no se escala bien.

Necesitará credenciales para acceder a prácticamente cualquier cosa fuera de la zona de pruebas de Firebase. Para otros servicios de Google Cloud, estas credenciales vienen en forma de .jsonarchivos. Multiplique eso por cada entorno (desarrollo, producción, puesta en escena) y puede terminar con un desastre real.

Terminé cambiando manualmente el nombre de los archivos de credenciales antes de implementarlos, o peor aún, implementando todas las credenciales y seleccionando la apropiada en tiempo de ejecución. Por favor, avíseme en los comentarios si ha encontrado una forma de evitar esto.

Me encantaría ver una pestaña de Entorno en la consola de Firebase donde podría administrar fácilmente estas configuraciones para todo el proyecto de Firebase. Cambiar entre entornos debería ser tan fácil como firebase use production.

Conclusión

Aparte de algunas fricciones durante la fase de desarrollo, mi experiencia con Firebase Cloud Functions ha sido positiva. Una vez implementadas, estas cosas son confiables y no requieren mantenimiento como se prometió. Entonces, sí, Firebase finalmente no tiene servidor. ¡Hurra!

Si ya está utilizando Firebase, es realmente una obviedad. Firebase Cloud Functions es un gran complemento para su proyecto, incluso si el servicio aún está en versión Beta.

Por otro lado, es justo decir que la competencia tiene un producto más maduro. Si no ha invertido en Firebase o Google Cloud, y está considerando usar funciones en la nube en su pila, probablemente debería estar investigando lo que AWS o Azure tienen para ofrecer también.

Para ser completamente honesto, me preocupa un poco que el servicio todavía esté en versión beta. Ha pasado más de un año desde que se anunció y el progreso se siente dolorosamente lento. La competencia parece mucho más comprometida con sus productos en la nube, incluso si, según Diane Greene, directora ejecutiva de los negocios en la nube de Google, Google Cloud es la "nube de más rápido crecimiento".

Eso es todo.

Nota: En una versión anterior de este artículo, afirmé que no era posible escribir pruebas para funciones que no fueran HTTP. Esto está mal, y aquí están los documentos sobre cómo hacerlo.