
Sesenta contenedores en un servidor
Un servidor bare-metal ejecuta decenas a cientos de contenedores Hoody. KSM y dedup BTRFS hacen que el costo marginal sea casi cero.
Cada lunes a las 9, una entrada de cron despierta un único contenedor. El script renderiza el resumen una vez y lo escribe a una URL de pipe con ?n=200. Doscientos bucles de curl — uno por suscriptor — tiran de los mismos bytes en paralelo y los entregan a SMTP. El fan-out vive en el sustrato, no en tu código.
Tu resumen del lunes — 4 cosas que vale la pena abrir esta semana
Los bonos repuntaron tras unos payrolls más blandos; la curva se desinvirtió en el tramo corto. Marcamos dos nombres con resultados que el mercado está mal-valorando.
Dos gráficos: net-flows semanales hacia ETFs de infraestructura de IA, y un desglose del CPI que disiente del titular.
Lista de lectura: una pieza larga sobre crédito privado y una nota afilada sobre por qué el ciclo de tipos es más corto que el de 2008.
→ Abre el resumen completo
0 9 * * 1 bash /scripts/digest.shUN DESPERTAR · UN RENDER · DOSCIENTAS DESCARGAS PARALELAS
La API de Hoody Cron suelta una línea de crontab de 5 campos en una entrada gestionada. La línea ejecuta un script exec que renderiza el resumen una vez y lo empuja a una ruta de pipe con n=200. Doscientos bucles de suscriptor tiran de la misma ruta en paralelo — el servidor no retiene nada, y un lector lento no puede bloquear al resto.
El cron no se complicó más. El fan-out se movió al sustrato — el pipe no retiene nada, el script renderiza una vez y el bucle es solo SMTP en el borde. Sin cola, sin tabla de reintentos, sin asiento de herramienta de campañas.
El diseño naive recorre 200 envíos SMTP en serie, tarda 11 minutos y duplica entregas cuando se cae a mitad. La forma del pipe te da paralelismo, idempotencia y un contenedor más pequeño — gratis.
El resumen se construye exactamente una vez. Doscientos bucles de curl tiran de los mismos bytes simultáneamente. Una ejecución de 4 segundos reemplaza un bucle serial de 11 minutos — el pipe aplica backpressure a los lectores lentos sin bloquear al resto.
No hay tabla de estado de campaña que consultar. Si la ejecución muere antes de que se conecten los 200, el TTL del pipe descarta la mitad sin terminar y el siguiente tick de cron re-renderiza. Sin entregas duplicadas, sin lote a medio enviar que reconciliar.
El script despierta una vez por semana, corre cuatro segundos y el contenedor vuelve a inactivo. Pagas por los cuatro segundos — no por un servicio de campañas always-on, no por una factura de SES por destinatario, no por un asiento de Mailchimp.
Mismos 200 destinatarios, mismo cuerpo de resumen. Lo que se mueve es la forma de la ejecución — de minutos-de-SMTP-serial a segundos-de-HTTP-paralelo.
Tiempo de reloj desde el tick del cron hasta la última entrega. El pipe transmite a los 200 receptores en paralelo; el cuello de botella se vuelve el SMTP del suscriptor más lento, no el bucle.
El cuerpo del resumen se computa una vez. El pipe reenvía los mismos bytes a cada receptor — sin re-render de plantilla por destinatario, sin facturación por destinatario, sin caché por destinatario.
La API de Hoody Pipe limita n a 256. Un resumen semanal a 200 entra cómodamente bajo el techo — y un lector lento aplica backpressure pero no bloquea a los demás.
Límites según la API de Hoody Pipe: receptores 1–256, TTL de pipe de 5 minutos esperando conexiones, 1000 transferencias activas en todo el servidor. La entrada de cron en sí es una fila en /users/root/entries con schedule, command y un expires_at opcional.
Cuatro momentos. Cada uno es una llamada HTTP única que harías a mano. El cron es el despertador; exec es el renderizador; el pipe es el cable; el bucle es lo único que el agente escribe.
La entrada gestionada en /users/root/entries se dispara. Schedule: 0 9 * * 1. Comando: bash /scripts/digest.sh. El crontab en sí es un único registro JSON — no un DAG de Airflow, no un servicio de workflows.
El script exec tira de los datos de la semana, renderiza el markdown, convierte a HTML y escribe el cuerpo a stdout. Un render, un payload — sin bucle de mail-merge por destinatario.
El script tubería stdout a curl -T - contra pipe/digest-monday?n=200. El pipe retiene la subida hasta que se conectan 200 receptores, y luego transmite el cuerpo a todos en paralelo.
Doscientos bucles hacen curl a la misma ruta y entregan el cuerpo al SMTP de su suscriptor. Los lentos reciben backpressure. Los rápidos terminan en milisegundos. Toda la ejecución acaba en segundos.
Una entrada de cron, un contenedor, doscientos destinatarios.
Las herramientas estándar a las que recurres cuando quieres enviar el mismo email a una lista. Cada una te cobra un nivel de servicio por lo que es, al final, un render y un bucle HTTP de fan-out.
Lunes a las 9 solía significar un worker moliendo SMTP. Ahora significa un tick de cron, un contenedor y un pipe que hace el resto.