Diagnóstico inicial: ¿API lenta o base de datos lenta?
Para identificar el problema, me propuse hacer una serie de pruebas combinando distintas plataformas de despliegue, tanto para la API como para la base de datos. Aquí está lo que encontré:
Vercel (API) + Supabase (DB) Tiempo promedio: 1.5 segundos. Esto era lo que tenía originalmente. Rendimiento muy pobre, especialmente al hacer consultas para listar todos los posts.
Railway (API + DB) Tiempo promedio: 0.5 segundos. Una mejora increíble es literalmente 3 veces más rápida que como lo tenía al inicio.
Railway (API) + Supabase (DB) Tiempo promedio: 1.3 - 1.5 segundos. Volvió el cuello de botella. Esto confirmó que el problema no era la API, sino la conexión a la base de datos de Supabase.
Railway (API) + NeonDB (DB) Tiempo promedio: 0.6 - 0.9 segundos. Buen rendimiento. No tan rápido como todo en Railway, pero muchísimo mejor que con Supabase.
Vercel (API) + NeonDB (DB) Tiempo promedio: 0.6 - 0.9 segundos. Resultado similar a Railway + NeonDB, lo que refuerza la idea de que el mayor cuello de botella era Supabase, no la plataforma donde corre la API.
Aquí pueden ver una tabla con las diferentes combinaciones que probé y sus tiempos promedio. La combinación Vercel + NeonDB es ligeramente más lenta en comparación con Railway + NeonDB. Esto se debe a que en Vercel, la primera llamada a la API suele tardar un poco más en responder, probablemente debido a las serverless functions. Sin embargo, una vez realizada esa primera petición, los tiempos se estabilizan y mejoran.
Conclusión
Después de todas estas pruebas, queda claro que Supabase no está ofreciendo buen rendimiento para consultas rápidas, al menos en mi caso de uso. Las opciones más viables actualmente son:
- Railway para todo (API + DB): la mejor velocidad, pero tendría que adquirir un plan Hobby, el cual cuesta 5 dólares mensuales, y no tengo planeado esa inversión por el momento.
- Vercel (API) + NeonDB (DB): un balance bastante bueno, con buena velocidad, y NeonDB ofreciendo una capa gratuita muy atractiva, solo que con un límite de 500mb de almacenamiento.
Próximos pasos
Por ahora estoy evaluando migrar completamente a Vercel y NeonDB, dependiendo de cómo evolucione el proyecto y el uso. También estoy planeando implementar técnicas adicionales de optimización de consultas y caché, pero eso lo contaré en los próximos devlogs.