PlanetScale + Cloudflare Workers. Solución de arquitectura para startups.
Hace tiempo vengo trabajando en una aplicación que te permite buscar academias de jiu-jitsu para entrenar. Esta construida sobre la API de google maps. Podes buscar una locación y te muestra todas las academias de la zona e información sobre ellas. Como es un MVP y quería hacerlo lo más rápido posible las academias están hardcodeadas (es decir: implementadas directamente en el código y no en una base de datos). No hace falta ni hablar de las consecuencias que trae esto pero el costo en tiempos de implementar una base de datos y su posterior mantenimiento no estaba dentro de mis planes iniciales. Hasta ahora, como las academias son muy pocas y no cambian en el tiempo venia funcionando pero estos últimos días estuve trabajando en una funcionalidad de “torneos” donde se pueden visualizar todas las competencias cerca de tu zona. Como los torneos están sujetos a actualizaciones diarias no me iba a funcionar el mismo approach que tuve con las academias. Una nueva versión de una aplicación mobile puede tardar hasta una semana en deployarse en las stores. No nos sirve.
No es una buena práctica acceder a la base de datos desde el front-end así que vamos a necesitar un intermediario (comúnmente un servicio backend). Si fuera una aplicación web podríamos utilizar la API de NextJS pero como estamos hablando de una aplicación construida con react-native el intermediario vamos a tener que construirlo nosotros.
Base de datos
En algun lugar vamos a tener que guardar todos los datos que necesitamos. En mi caso es muy simple porque solamente necesito guardar la información de los torneos: titulo, descripción, cuando empieza, página de contacto, teléfono, organizador, locación y la url de una imagen para el banner (a verse). Se puede pensar en usar servicios de google como sheets y consumir la data directamente desde ahí pero ya quiero aprovechar a implementar una base de datos porque necesito una solución que escale. En esta instancia hay que pensar si se quiere una base de datos relacional o no relacional pero no me enroscaría mucho en esto, la forma más simple de encararlo es con una base relacional (posiblemente es la que necesites al principio también).
Fui por las solución mas estándar y la que me parece de más rápida implementación: mysql. Instale el servidor, mysqlworkbench como GUI e hice algunas pruebas locales. Después de un rato tenia una base de datos llamada bjjfinder (el nombre de la aplicación) con una tabla “tournaments” que consistía de las siguientes columnas:
id int NOT NULL AUTO_INCREMENT,
title varchar(),
description varchar(),
start_date datetime,
contact_page varchar(),
phone varchar(),
organizer varchar(),
location varchar(),
banner_url varchar()
Después de algunas pruebas toca deployar la base de datos. Uno de mis puntos principales de decisión es utilizar servicios que me permitan gastar la menor cantidad de dinero posible. Fui por una solución no tan amigable pero de la que tengo conocimiento: el servicio RDS de AWS. Es uno de los servicios de Amazon que te permite deployar una base de datos (Postgress, mysql, aurora, etc). Después de jugar un poco con la consola me di cuenta que actualizaron las condiciones del alcance del free-tier y, como utilizo aws en varios proyectos, ya no tengo créditos anuales. Adiós AWS (por ahora). Ahí empece a buscar qué otras soluciones existen y me cruce con una herramienta de la cual me enamoré: PlanetScale. Tiene un free-tier que alcanza y sobra para startups que recién comienzan. Un hermoso plug-and-play. Después de jugar un poco con la documentación ya tenia armada la base mysql en la plataforma. Para insertar y modificar datos pueden utilizar el GUI amigable de PlanetScale o, como en mi caso, la consola de mysql desde la terminal de mi computadora.
Fetching de datos
Una vez que tenes una base de datos deployada en producción necesitamos una forma de obtener la información. No podemos realizar una conexión directa a nuestra bbdd desde una aplicación front-end porque es inseguro así que necesitamos un intermediario. Lo más común es una arquitectura del siguiente estilo:
En este caso nuestra capa de “servicio” puede ser una aplicación en NodeJS o Python que interactúe con la base de datos. El problema aparece cuando vemos los costos de implementar un servicio así, tanto en tiempo como en dinero. Y si uno no sabe programar puede ser un problema. No solo eso: implementar un servicio es bastante complejo debido a varias cosas que tenés que tener en cuenta: capacidad del servicio, acceso, load balancers, etc. Esto es una “”startup”” así que me puse a buscar otra solución.
Que estoy construyendo? de momento solamente necesito consultar datos muy simples sin ningún tipo de autenticación o modificación. Es necesario construir un servidor con Node o Java para lograr lo que quiero? No. Acá entra en juego el concepto “serverless” (literalmente no utilizar servidores). Existen plataformas que te dan la posibilidad de ejecutar código javascript sin la necesidad de implementar un servidor NodeJS. Acá los workers de cloudflare son una de las mejores opciones! Usando un poco de código javascript podes manipular llamadas http sin problemas (y su free-tire es buenísimo). El código se ejecuta en servidores distribuidos geográficamente que permiten que los usuarios accedan mucho más rápido a la información. Como un CDN pero programable (busquen concepto “Edge computing”). Lo más lindo de todo? Buscando un poco encontré que PlanetScale tiene su propia integración con los workers de cloudflare. Después de jugar un rato ya tenia un endpoint (url) que me daba toda la información de los torneos. Lo único que quedaba es consumir esa URL desde el front-end y ya está. La configuración standar de cloudflare y planetscale es bastante buena pero siempre se puede mejorar. Por ejemplo: si decido migrar los datos de las academias a la base seguramente implemente un redis así evito las llamadas al servidor y no nos pasamos del consumo que queremos.
Conclusion
Con todas las herramientas que existen actualmente es muy fácil lanzar un proyecto. Por lo general, si estas haciendo un MVP, suele ser muy sencillo deployarlo sin costos. Solamente hay que rebuscarsela. Si no sabes programar también es fácil, quizás tengas que leer un poco más o gastar un poco en herramientas no-code pero no hace falta. Si, por ejemplo, queres crear un worker podes hasta pedirle a chatgpt que lo haga por vos. A prueba y error.
¿Dudas? hablemos por twitter — https://twitter.com/lfordev
Base de datos
mysql: https://dev.mysql.com/downloads/mysql/
mysqlWorkbench: https://www.mysql.com/products/workbench/
Donde deployar: https://planetscale.com/
Fetching de datos
Cloudflare workers: https://www.cloudflare.com/es-es/
Integración con planetscale:
Edge computing: