Startups·NewsTide Editorial·29 jun 2026·6 min de lectura·🇬🇧 EN

Tracelytics reescribió su backend de observabilidad en Deno: por qué el runtime de Node.js les costaba €40K mensuales

Tracelytics, una startup europea, estaba luchando. Durante seis meses, intentaron contener una factura de infraestructura que subía un 30% por trimestre. Su plataforma de observabilidad procesaba más de 80 millones de eventos diarios desde microservicios dispersos. El problema no era la escala, sino Node.js. Empezaron con una arquitectura basada en Express y módulos npm, que funcionaba bien al inicio, pero en producción se volvió insostenible. Los workers consumían 400MB de RAM en reposo, los cold starts alcanzaban 3.5 segundos, y el equipo gastaba más tiempo en actualizar dependencias que en innovar. En octubre de 2025, Alexander Brandt, el CTO, dio un paso radical y decidió migrar el core de la plataforma a Deno.

lines of HTML codes Photo: Florian Olivo on Unsplash

Cinco meses más tarde, Tracelytics duplicó su tráfico manejado con la mitad de instancias. La factura de AWS bajó de €68K a €28K mensuales y el tiempo de respuesta promedio de su API se redujo de 340ms a 85ms. Sin embargo, la verdadera victoria estuvo en la arquitectura que pudieron construir cuando el runtime dejó de ser un problema. Esta es la historia de cómo una startup europea apostó por Deno en producción, obteniendo dos años de ventaja sobre competidores aún atados a npm.

El punto de quiebre: Node.js se convirtió en un cuello de botella

A pesar de sus problemas, Tracelytics no odia Node.js. De hecho, su equipo fundador tiene experiencia en JavaScript en el backend proveniente de empresas como Datadog y New Relic. Sin embargo, los problemas comenzaron cuando pasaron de 5 clientes beta a 40 clientes pagando entre €2K y €15K mensuales. Aunque su stack inicial parecía sólido con Express para la API REST, Redis para caché, y PostgreSQL para persistencia, en producción, todo cambió.

El primer síntoma fue la latencia. Los clientes enterprise esperaban latencias p99 bajo 200ms, pero Tracelytics prometía 150ms y no cumplía. Los cold starts en Lambda eran impredecibles: 1.2 segundos en promedio, alcanzando picos de 4 segundos. Tras una investigación, encontraron que cada Lambda arrastraba un node_modules de 280MB, lleno de dependencias no utilizadas. Intentaron mitigar esto usando herramientas como webpack y esbuild, pero solo lograron reducir los cold starts a 2.8 segundos, aún inaceptables.

Lo curioso es que, en términos de memoria, cada instancia consumía 400MB de RAM en estado idle, escalando a 850MB cuando procesaba eventos. Pagaban por 51GB de RAM, pero realmente necesitaban 18GB. En términos de seguridad, en seis meses, debieron parchear 14 vulnerabilidades críticas en npm. Imagina correr npm audit, leer el informe, actualizar, testear y esperar que nada se rompiera, todo en ciclos de 4 a 6 horas por semana. Brandt estimó que gastaban €12K anuales solo en mantener npm actualizado.

Por qué Deno fue la única opción viable (y no Bun ni Rust)

laptop screen displaying colorful code Photo: Mohammad Rahmani on Unsplash

¿Reescribir en Rust? Ese fue un debate interno. Rust podría haber eliminado problemas de memoria y rendimiento, pero Brandt lo descartó: solo uno de ocho ingenieros tenía experiencia real en Rust, lo que haría devastador el tiempo necesario para reescribir 45K líneas de TypeScript. Bun, aunque prometedor, era inmaduro en 2025 y sin empresas serias que lo usaran en producción enterprise, no era una opción viable.

Por otro lado, Deno ofrecía algo único: compatibilidad total con TypeScript nativo, seguridad por defecto, y un modelo de permisos granular sin sacrificar el ecosistema JavaScript. ¿La clave? Mantener la productividad del equipo (todos escribían TypeScript), eliminar npm (importando dependencias por URLs con versionado explícito), mejorar la seguridad (permisos explícitos) y rendimiento (Deno usa Tokio y Rust internamente).

El equipo realizó una prueba de concepto en dos semanas, reescribiendo el servicio de ingestion, el componente más crítico:

  • Cold start: de 2.8s a 340ms (un 8x más rápido)
  • Memoria en reposo: de 400MB a 110MB (3.6x más eficiente)
  • Throughput: de 12K a 31K eventos/seg
  • Tamaño del bundle: de 45MB a 8MB
  • Dependencias externas: de 140 paquetes npm a 4 módulos remotos

Brandt aprobó la migración completa en tres meses.

La arquitectura real: cómo migraron sin romper producción

Garantizar cero downtime fue clave. Con SLAs de 99.9% y penalizaciones contractuales, Tracelytics no podía arriesgarse. Optaron por una estrategia híbrida: mantuvieron Node.js en producción mientras construían la nueva infraestructura Deno en paralelo, migrando componentes uno a uno con feature flags y traffic splitting.

Fase 1: Ingestion Layer (semanas 1-4)

El primer componente migrado fue el ingestion service. En Node.js usaban Express, ajv y kafkajs. En Deno, se pasaron a:

  • Oak como middleware
  • Zod para validaciones
  • kafka-deno para Kafka sin dependencias C++

Desplegaron ambas versiones en paralelo, configuraron ALB de AWS para enviar el 10% del tráfico a Deno, monitorearon, y escalaron hasta el 100% sin incidentes.

Fase 2: Query Engine (semanas 5-9)

En la segunda fase, migraron el query engine, el servicio que permite consultas GraphQL. El desafío era la seguridad. En Node, Apollo Server tiene acceso implícito a todo. En Deno, usaron gql con permisos explícitos, limitando accesos para mitigar vulnerabilidades.

Fase 3: Background Workers (semanas 10-12)

Finalmente, migraron los workers que procesan agregaciones y alertas. En Node.js, usaban BullMQ con Redis, pero cada worker consumía memoria incluso sin trabajo. En Deno, implementaron un modelo más eficiente, bajando el consumo de 16GB a 4.8GB.

Los números reales: qué cambiaron y qué no

Tras cinco meses, Brandt compartió algunos resultados:

Infraestructura:

  • Instancias EC2: de 28 a 12
  • Memoria total: de 48GB a 18GB
  • Factura AWS: de €68K a €28K

Performance:

  • Latencia p99 API: de 340ms a 85ms
  • Cold start promedio: de 2.8s a 340ms
  • Throughput de ingestion: de 12K a 31K eventos/seg

Operaciones:

  • Incidentes de seguridad: de 14 a 0
  • Tiempo en mantenimiento: de 6h/semana a 30min
  • Deployments fallidos: de 3 a 0

Curiosamente, lo que no cambió fue el tiempo de desarrollo de nuevas features ni la curva de aprendizaje, ya que TypeScript sigue siendo TypeScript. La clave fue que la productividad del equipo se mantuvo.

Las decisiones técnicas que nadie documenta

Tres decisiones críticas no documentadas en ningún tutorial de Deno fueron:

1. No eliminaron npm completamente

Mantuvieron un pequeño servicio auxiliar en Node.js para librerías específicas donde Deno aún no tenía alternativas maduras. Este servicio se comunica con el core Deno vía gRPC. Sólido pragmatismo.

2. Versionaron absolutamente todo

Crearon un archivo deps.ts centralizado donde todas las dependencias externas están explícitamente versionadas. Esto garantiza builds reproducibles y elimina riesgos.

3. Construyeron su propio registry interno

Montaron un registry privado usando Deno Deploy donde publican módulos internos con versionado semántico. Un paso inteligente para mantener la estructura del proyecto.

La lección invisible: el runtime determina tu arquitectura

Para cerrar, Brandt concluyó: "No migramos a Deno por performance, sino porque Node.js nos obligaba a ser defensivos todo el tiempo". Cada decisión estaba contaminada por la pregunta: ¿Esta dependencia es segura? ¿Romperá en la próxima versión? Deno permitió moverse rápido sin romper cosas. La verdadera ganancia fue la libertad de centrarse en lo que importa: crear features valiosos. ¿Tu startup sigue pegada a Node.js? Tal vez estás atado a un runtime que, aunque familiar, limita tu capacidad para escalar eficientemente.

Nota editorial: Este artículo ha sido generado con asistencia de inteligencia artificial y revisado por el equipo editorial de NewsTide para garantizar su precisión y relevancia. Conoce nuestra política editorial.

Más sobre Startups

Cuando Prisma se volvió la única ruta viable para que Wally migrara de MongoDB a Postgres sin romper producciónLinear dejó de ser un gestor de tareas el día que automatizó el roadmap completo de ReplicateSupabase se convirtió en el backend invisible de Plata: cómo una fintech latinoamericana escala con Postgres y evita el infierno de FirebaseImplementando un sistema de retención de talento en IA: guía técnica para startups usando Airtable yLa arquitectura completa para escalar equipos de IA: Notion como CRM de talento y GCP como infraestructura operativaTu startup de IA va a perder tres ingenieros clave este año: así proteges tu modelo antes de que eso paseNotion como sistema nervioso de tu startup: la arquitectura completa para gestionar talento en equipos de IACuando tu modelo de IA necesita reinventarse solo: arquitectura completa para auto-optimización continua sin humanos
← Volver al inicioVer todos de Startups