Cloudflare Dynamic Workers: el secreto de un sandbox para agentes de IA 100 veces más rápido que los contenedores

Tu agente de IA acaba de generar código de análisis de datos y, al ejecutarlo, el contenedor tarda 3 segundos en arrancar, ocupa 200 MB de memoria y la solicitud del usuario ya expiró. No es un caso aislado: es el dolor habitual de toda la industria al ejecutar código de IA en contenedores.
Cloudflare lanzó Dynamic Workers en marzo de 2026 y, con V8 Isolates, redujo ese tiempo de arranque a milisegundos y la memoria a unos pocos MB. Una mejora de rendimiento de 100 veces. Detrás hay una filosofía de aislamiento completamente distinta.
En pocas palabras, Dynamic Workers no es un «contenedor más rápido», sino lo que hace viable económicamente el modelo de «un sandbox por solicitud». Este artículo analiza en profundidad la diferencia esencial entre V8 Isolates y los contenedores tradicionales, incluye ejemplos prácticos de Dynamic Workers y te ayuda a decidir. Si estás eligiendo un sandbox para tu agente de IA, aquí puedes hacer bien las cuentas.
Por qué los contenedores se convirtieron en el cuello de botella de los agentes de IA
¿Cómo se hacía antes? Los contenedores eran la opción dominante. Kubernetes levanta un Pod, descarga la imagen, configura el entorno: un flujo maduro pero pesado. En agentes de IA hay un patrón claro: la ejecución de código es instantánea (un script de análisis puede durar segundos), pero arrancar el contenedor lleva más de 3 segundos. Algo no encaja.
Según un informe de 2026 sobre sandboxes para agentes de IA, un contenedor Docker arranca en unos 500 ms, pero eso es solo el «arranque»: sumando descarga de imagen, red y dependencias, el tiempo real suele superar los 3 segundos. ¿Memoria? Desde decenas de MB y en entornos complejos más de 200 MB.
Quizá pienses: ¿un pool precalentado no lo resuelve? Sí, es el enfoque habitual. Pero surgen problemas:
Primero, el costo. El pool mantiene contenedores activos aunque no haya solicitudes. Cien contenedores precalentados de 200 MB cada uno ya suponen un gasto considerable en memoria. Además está el riesgo de reutilización: datos de la solicitud anterior pueden quedar en memoria.
Segundo, la complejidad. Hay que gestionar ciclo de vida, health checks y autoescalado. La infraestructura en sí ya es un dolor de cabeza. En un proyecto usé un pool precalentado en Kubernetes y el costo de mantenimiento superó al del código de negocio.
Tercero, desajuste de escenario. La ejecución de código en agentes de IA suele ser puntual: el usuario sube un CSV, la IA genera el análisis, se ejecuta y se destruye. Cada solicitud necesita aislamiento independiente, pero reutilizar contenedores rompe ese aislamiento.
Imagina esto: el agente del usuario A ejecuta código con datos sensibles. El contenedor vuelve al pool; llega la solicitud del usuario B y recibe el mismo contenedor. Aunque haya limpieza, el riesgo de datos residuales persiste. No es teórico: en 2025 hubo incidentes de filtración por residuos en contenedores.
La contradicción es clara: arranque lento, memoria cara, riesgo en pools precalentados y alta complejidad operativa. No es que los contenedores sean malos, sino que su filosofía no encaja con el patrón de ejecución de agentes de IA.
Cómo V8 Isolates reduce el arranque a milisegundos
¿Qué son V8 Isolates? El motor JavaScript de Chrome compila JS a código máquina. Un Isolate es la unidad de aislamiento de V8: un entorno independiente con su propio heap, caché de compilación y objetos globales.
La clave: un Isolate no invoca el kernel del sistema operativo anfitrión.
¿Cómo funcionan los contenedores? Arrancan un proceso y llaman syscalls del kernel. El aislamiento depende de namespace y cgroup a nivel de kernel. Pero es aislamiento «parcial»: contenedor y host comparten el mismo kernel y las syscalls van por la misma ruta.
V8 Isolates es distinto. El JavaScript se ejecuta dentro del Isolate sin generar syscalls. Todo ocurre en el proceso: asignación de memoria, GC, compilación. El límite de aislamiento está dentro del proceso, no en el kernel.
Un reporte de 2026 cita cifras concretas: arranque en milisegundos y memoria en unos MB. Frente a contenedores: 100 veces más rápido y 10-100 veces más eficiente en memoria.
Tabla comparativa de tecnologías de aislamiento:
| Tecnología | Nivel de seguridad | Velocidad de arranque | Memoria | Destino de syscalls |
|---|---|---|---|---|
| Contenedor Docker | ⭐⭐ | ~500 ms | Decenas de MB | Kernel compartido del host |
| gVisor | ⭐⭐⭐⭐ | ~100 ms | Alta | Interceptadas en kernel de user space |
| Firecracker microVM | ⭐⭐⭐⭐⭐ | ~150 ms | ~1 GB | Kernel virtual independiente |
| V8 Isolates | ⭐⭐⭐ | Pocos ms | Pocos MB | No las invoca |
La tabla muestra un trade-off clave: seguridad y velocidad de arranque compiten. Firecracker es lo más seguro (kernel virtual propio) pero más lento y caro en memoria. V8 Isolates es lo más rápido y económico, con seguridad media.
¿Por qué solo tres estrellas? Porque el límite está dentro del proceso. Si un Isolate se compromete, podría afectar a otros en el mismo proceso. Más seguro que contenedores que comparten kernel (pero con namespace), menos que microVM con kernel independiente.
Cloudflare añade en Dynamic Workers varias capas que elevan ese nivel «de tres estrellas» a algo aceptable en producción. Más adelante detallamos las cinco defensas.
El núcleo de V8 Isolates no es «más seguro», sino «más barato». Arrancar un sandbox por solicitud y destruirlo al terminar es un lujo en el mundo de contenedores y estándar en el de Isolates.
Dynamic Workers API: la filosofía de load() y get()
Dynamic Workers ofrece dos modos con una filosofía clara: uno para ejecución instantánea y otro para ciclo de vida largo.
load(): ejecución única, destruir al terminar
El modo load() encaja con ejecución puntual. Entra el código generado por IA, arranca el Isolate, ejecuta y destruye. Todo en milisegundos.
// Modo load(): ejecución única
import { DynamicWorkerLoader } from 'cloudflare:sandbox-sdk';
const loader = new DynamicWorkerLoader();
// Cargar código, enlazar recursos, definir límites
const dynamicWorker = await loader.load({
code: aiGeneratedCode, // Cadena de código generada por IA
bindings: {
db: env.DB, // Enlace a base D1
kv: env.KV, // Enlace a KV
},
limits: {
cpuMs: 100, // Límite de CPU: 100 ms
memoryMB: 128, // Límite de memoria: 128 MB
}
});
// Ejecutar y obtener resultado
const result = await dynamicWorker.execute();
// Al terminar, el Isolate se destruye automáticamente
console.log(result);
Parámetros clave:
code: cadena de código a ejecutar, puede ser generada dinámicamente por IAbindings: recursos externos (base de datos, almacenamiento, API)limits: límites de ejecución para evitar abuso
Casos de uso de load():
- Análisis puntual: el usuario sube CSV, la IA genera el código, se ejecuta una vez y se destruye
- Código temporal: scripts de transformación o validación generados por IA
- Aislamiento por solicitud: sandbox independiente sin riesgo de residuos
get(): caché precalentada, ciclo de vida largo
El modo get() encaja cuando necesitas estado precalentado. El Isolate se crea y permanece en memoria; las llamadas siguientes lo reutilizan.
// Modo get(): caché precalentada
const cachedWorker = await loader.get({
id: 'persistent-analyzer', // Identificador fijo para localizar la caché
code: analysisCode, // Código precargado
bindings: {
vectorize: env.VECTORIZE, // Enlace a base vectorial
}
});
// Varias llamadas manteniendo el estado precalentado
const result1 = await cachedWorker.execute({ input: data1 });
const result2 = await cachedWorker.execute({ input: data2 });
const result3 = await cachedWorker.execute({ input: data3 });
// Sin destrucción manual; Cloudflare gestiona el ciclo de vida
Casos de uso de get():
- Procesamiento por lotes: misma lógica sobre varios conjuntos de datos
- Agentes de larga duración: tareas de análisis con estado
- Menor latencia inicial: reduce el retraso del primer arranque
La diferencia esencial: load() es «alquilar una habitación por una noche»; get() es «alquilarla a largo plazo». El primero para escenarios instantáneos, el segundo para escenarios continuos.
El tutorial AI Code Executor del Sandbox SDK oficial de Cloudflare tiene ejemplos más completos; conviene leerlo antes de practicar.
Las cinco capas de seguridad de Dynamic Workers
Como vimos, V8 Isolates parte de un nivel base de tres estrellas. Cloudflare superpone defensas en Dynamic Workers hasta hacerlo usable en producción.
Un análisis de InfoQ de abril de 2026 desglosa estas cinco capas.
Primera capa: despliegue automático de parches V8
V8 tiene vulnerabilidades, como cualquier software complejo. Cuando el equipo de Chrome publica un parche, Cloudflare lo despliega en horas a todos los nodos globales.
Compara con contenedores: los parches dependen del sistema anfitrión y el ciclo puede ser de semanas o meses. Aquí la respuesta es de horas, no de semanas.
Segunda capa: tenant cordoning dinámico por riesgo
Si un Dynamic Worker muestra comportamiento anómalo (memoria disparada, CPU al máximo), Cloudflare lo marca como de alto riesgo y lo mueve a nodos aislados.
Eso es tenant cordoning: el tenant de riesgo queda aparte sin afectar a los Workers normales.
Tercera capa: protección MPK
MPK (Memory Protection Keys) es un mecanismo de aislamiento de memoria a nivel de hardware Intel. Cada Isolate tiene permisos de acceso independientes; el hardware bloquea accesos fuera de límites.
Protección física, más difícil de vulnerar que el aislamiento solo por software.
Cuarta capa: escaneo de código
Escaneo previo a la ejecución. Patrones maliciosos (bucles infinitos, bombas de memoria, llamadas a APIs sensibles) se interceptan automáticamente.
Esta capa apunta al código malicioso generado por IA. La inyección de prompt puede producir código peligroso; el escaneo lo frena antes de ejecutar.
Quinta capa: aislamiento de red
Por defecto, Dynamic Worker bloquea el acceso externo. Si necesitas APIs externas, el tráfico pasa por el egress proxy de Cloudflare con inyección de credenciales: solo APIs autorizadas.
Esquema simplificado de la arquitectura de seguridad:
Código generado por IA
|
v
┌─────────────────────────────────────┐
│ Dynamic Worker (V8 Isolate) │
│ ┌─────────────────────────────────┐ │
│ │ Capa 1: escaneo de código │ │
│ ├─────────────────────────────────┤ │
│ │ Capa 2: parches de seguridad V8 │ │
│ ├─────────────────────────────────┤ │
│ │ Capa 3: tenant cordoning │ │
│ ├─────────────────────────────────┤ │
│ │ Capa 4: protección MPK │ │
│ └─────────────────────────────────┘ │
│ | │
│ v │
│ Puente Cap'n Web RPC │
│ | │
│ v │
│ Capa 5: egress proxy + credenciales│
└─────────────────────────────────────┘
Estas capas hacen que el nivel «de tres estrellas» sea fiable en producción. No es seguridad absoluta (ningún sistema la tiene), sino un riesgo aceptable.
Precios de Dynamic Workers: por qué «un sandbox por solicitud» es viable
«Un sandbox por solicitud» suena caro. Con el modelo de costos de Dynamic Workers, es viable.
Estructura de precios de Cloudflare (gratis en beta; precios oficiales):
- $0.002 por Worker único cargado al día
- Más costo estándar de CPU: $0.02 por millón de milisegundos de CPU
- Más tarifa de invocación: $0.50 por millón de solicitudes
VentureBeat, abril de 2026: E2B (Firecracker microVM) cuesta más de $0.01 por solicitud; Dynamic Workers, $0.002.
Comparativa de costos:
| Solución | Costo por solicitud | Costo mensual (1 M solicitudes) | Complejidad | Mantenimiento |
|---|---|---|---|---|
| Pool precalentado | $0.02+ | $2000+ | Alta | Alto (gestionar pool) |
| E2B microVM | $0.01+ | $1000+ | Media | Bajo |
| Dynamic Workers | $0.002 | $200 | Baja | Ninguno |
Ejemplo: un millón de solicitudes diarias, cada una con código distinto (Worker único).
Pool precalentado:
- Cien contenedores de 200 MB: ~$500/mes solo en memoria
- Infraestructura del pool: al menos $1500/mes en operaciones
- Total: $2000+, más riesgo de seguridad
E2B:
- $0.01 por solicitud suena a $10 000/mes (con descuentos por volumen, ~$1000+)
- Latencia de arranque ~150 ms
Dynamic Workers:
- Si fueran un millón de Workers únicos diarios: $0.002 × 1 000 000 × 30 ≈ $60 000/mes (escenario extremo)
- Cálculo realista: 1000 Workers únicos al día → $0.002 × 1000 × 30 = $60/mes
- Sumando invocaciones y CPU, unos $200/mes
La clave: el cobro es por «Worker único», no por «número de solicitudes». Si tu agente usa plantillas de código fijas, los Workers únicos son muchos menos que las solicitudes y el costo baja.
Por eso «un sandbox por solicitud» es viable:
- Arranque en milisegundos, sin pool precalentado
- Poca memoria (unos MB), sin reservas grandes
- Precio por Worker único, no por solicitud
Frente a lo habitual:
- Pools complejos y costosos de operación
- Riesgo al reutilizar contenedores
- Retraso de 3 segundos que daña la experiencia
Dynamic Workers ataca esos tres puntos con menor costo. ¿Te cuadra la cuenta?
Dynamic Workers vs E2B vs gVisor: cómo elegir
Dynamic Workers tiene ventajas claras, pero no es universal. Cada escenario pide una solución distinta.
Comparativa completa:
| Dimensión | Dynamic Workers | E2B (Firecracker) | gVisor | Docker |
|---|---|---|---|---|
| Velocidad de arranque | ⭐⭐⭐⭐⭐ (pocos ms) | ⭐⭐⭐⭐ (~150 ms) | ⭐⭐⭐⭐ (~100 ms) | ⭐⭐⭐ (~500 ms) |
| Nivel de seguridad | ⭐⭐⭐ (medio) | ⭐⭐⭐⭐⭐ (máximo) | ⭐⭐⭐⭐ (alto) | ⭐⭐ (bajo) |
| Eficiencia de costo | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Lenguajes | Solo JS/TS | Cualquiera | Cualquiera | Cualquiera |
| Estado persistente | No (requiere DO) | Sí | No | Sí |
| Complejidad operativa | Baja | Baja | Media | Alta |
¿Cuándo elegir Dynamic Workers?
Encaja cuando:
- Tu agente de IA usa JavaScript o TypeScript
- Ejecución instantánea de alta frecuencia con aislamiento por solicitud
- Sensibilidad al costo y sin ganas de mantener pools precalentados
- Ya usas el stack de Cloudflare (Workers, KV, D1)
No encaja cuando:
- Necesitas Python, Rust o Go
- Exiges el máximo nivel de seguridad (datos financieros)
- Necesitas estado persistente (requiere Durable Objects)
¿Cuándo elegir E2B?
E2B usa Firecracker microVM: máxima seguridad, arranque ~150 ms.
Encaja cuando:
- Ejecutas Python (análisis de datos, ML)
- Máximo nivel de seguridad
- Aceptas ~150 ms de latencia de arranque
- Datos sensibles (finanzas, salud)
¿Cuándo elegir gVisor?
gVisor es el kernel en user space de Google, compatible con contenedores.
Encaja cuando:
- Necesitas compatibilidad con imágenes Docker existentes
- Buscas equilibrio entre seguridad y rendimiento
- Quieres subir el nivel de seguridad sin cambiar de stack
¿Cuándo seguir con Docker?
En muchos escenarios Docker basta.
Encaja cuando:
- No necesitas aislamiento por solicitud
- Servicios de larga duración (no ejecución instantánea)
- Infraestructura de contenedores ya madura
- El lenguaje no es JS/TS
La elección no es «cuál es mejor», sino «cuál encaja». Dynamic Workers brilla en agentes JS/TS, ejecución instantánea y costos ajustados, pero no sustituye todo.
Ecosistema de agentes Cloudflare: del sandbox al estado persistente
Dynamic Workers no es un producto aislado; forma parte del ecosistema de agentes de Cloudflare.
En abril de 2026 Cloudflare publicó Project Think, un framework para agentes de larga duración. Junto con Dynamic Workers y Durable Objects conforma un stack completo.
Arquitectura de tres capas
Project Think (clase Think - orquestación de agentes)
|
+-- Agent Memory (base SQL - estado persistente)
|
+-- Sub-agentes (coordinación)
|
+-- Dynamic Workers (ejecución en sandbox)
| |
| +-- Durable Objects Facets (SQLite independiente por sandbox)
|
+-- Tools (llamadas API - credenciales vía egress proxy)
Durable Objects Facets
Facets es una novedad de abril de 2026. Cada Dynamic Worker puede tener SQLite propia; el estado persiste tras destruir el sandbox.
Resuelve un punto débil: el sandbox se destruye al terminar y no guardaba estado. Facets da a cada sandbox su «cuaderno» para consultar historial.
Project Think
Project Think es el framework de agentes con la clase base Think. Heredas Think e implementas lógica propia: sub-agentes, estado y herramientas.
El ejemplo oficial: un agente de análisis de datos ejecuta código con Dynamic Workers, guarda historial en Facets y coordina sub-agentes con Project Think.
Agents SDK
Cloudflare ofrece Agents SDK, que integra Dynamic Workers, Durable Objects y Project Think. Con el SDK montas un agente de IA completo rápido.
// Ejemplo con Agents SDK
import { Agent } from 'cloudflare:agents-sdk';
class DataAnalysisAgent extends Agent {
async analyze(data: string) {
// Dynamic Workers ejecuta el código de análisis
const worker = await this.sandbox.load({
code: this.generateAnalysisCode(data),
bindings: { db: this.memory }
});
const result = await worker.execute();
// Guardar resultado en Facets
await this.memory.save(result);
return result;
}
}
Este ecosistema eleva Dynamic Workers de «sandbox simple» a pieza de un stack de agentes. Si necesitas persistencia, sub-agentes y herramientas, la solución integrada de Cloudflare suele ser más simple que armar varios servicios sueltos.
Conclusión
Dynamic Workers no pretende reemplazar todos los sandboxes: ofrece una opción con mejora de rendimiento de 100 veces en escenarios concretos.
Valor central: hacer viable económicamente lo que antes solo era viable técnicamente: «un sandbox por solicitud».
Si tu agente de IA usa JavaScript o TypeScript, necesitas aislamiento independiente por usuario y te importa el costo, Dynamic Workers es hoy la opción más adecuada.
Próximos pasos:
- Consulta la documentación oficial de Cloudflare Dynamic Workers
- Sigue el tutorial AI Code Executor del Sandbox SDK para tu primer sandbox
- Combina Durable Objects Facets para persistencia de estado
- Si tu agente es de larga duración y coordinación, explora Project Think
Al final, elegir tecnología es hacer cuentas: velocidad de arranque, costo de memoria, nivel de seguridad y complejidad operativa. Dynamic Workers responde en las cuatro; lo que queda es comprobar si encaja con tu escenario.
FAQ
¿Dynamic Workers puede ejecutar código Python?
¿El nivel de seguridad de V8 Isolates es suficiente?
¿Qué diferencia hay entre load() y get()?
get() es precalentamiento en caché, ideal para procesamiento por lotes o agentes de larga duración. El Isolate permanece en memoria y las llamadas posteriores lo reutilizan.
¿Cómo se calcula el precio de Dynamic Workers?
¿Cómo lograr persistencia de estado?
¿Pool precalentado o Dynamic Workers?
Dynamic Workers encaja con ejecución instantánea de alta frecuencia (ejecución de código de agentes de IA), solo JS/TS, menor costo y aislamiento independiente por solicitud sin riesgo de reutilización.
14 min de lectura · Publicado el: 25 abr 2026 · Actualizado el: 21 ago 2026
Cloudflare Full Stack
Si llegaste desde búsqueda, lo más rápido es ir al artículo anterior o siguiente de esta misma serie.
Anterior
Cloudflare Workers KV en la práctica: almacenamiento clave-valor distribuido de principio a fin
Arquitectura de Workers KV, optimización de rendimiento y código de Session Storage y API Cache. Guía de decisión KV vs D1 vs R2.
Parte 19 de 23
Siguiente
Cloudflare D1 en la práctica: SQLite en el edge con replicación global
Análisis profundo de la arquitectura de Cloudflare D1, código práctico con Sessions API para replicación de lectura global y datos de rendimiento frente a Turso/PlanetScale para elegir bien tu base de datos en el edge.
Parte 21 de 23



Comentarios
Inicia sesión con GitHub para dejar un comentario