Soixante conteneurs sur un seul serveur
Une seule machine bare-metal fait tourner des dizaines à des centaines de conteneurs Hoody. La déduplication KSM et BTRFS rend le coût marginal quasi nul.
Chaque lundi à 9h, une seule entrée cron réveille un seul container. Le script rend le digest une fois et l'écrit sur une URL pipe avec ?n=200. Deux cents boucles curl — une par abonné — tirent les mêmes octets en parallèle et les passent à SMTP. Le fan-out vit dans le substrat, pas dans votre code.
votre digest du lundi — 4 lectures qui valent le coup cette semaine
Les obligations remontent sur des chiffres d'emploi plus mous ; la courbe se dés-inverse sur le court terme. On signale deux noms dont les résultats sont mal valorisés par le marché.
Deux graphiques : flux nets hebdomadaires sur les ETF d'infra IA, et une décomposition CPI qui contredit le titre.
À lire : un long papier sur le crédit privé, et une note tranchée expliquant pourquoi le cycle de taux est plus court que celui de 2008.
→ Ouvrir le digest complet
0 9 * * 1 bash /scripts/digest.shUN RÉVEIL · UN RENDU · DEUX CENTS PULL EN PARALLÈLE
La Hoody Cron API dépose une ligne crontab à 5 champs dans une entrée gérée. La ligne exécute un script qui rend le digest une fois et le pousse sur un chemin pipe avec n=200. Deux cents boucles d'abonnés tirent le même chemin en parallèle — le serveur ne retient rien, et un lecteur lent ne peut pas bloquer les autres.
Le cron n'est pas devenu plus complexe. Le fan-out a été déplacé dans le substrat — le pipe ne retient rien, le script rend une fois, et la boucle n'est que du SMTP en bord. Pas de queue, pas de table de retry, pas de siège dans un outil de campagne.
Le design naïf boucle 200 envois SMTP en série, prend 11 minutes, et double-livre quand il crashe à mi-parcours. La forme pipe vous donne parallélisme, idempotence, et un conteneur plus petit — gratuitement.
Le digest est construit exactement une fois. Deux cents boucles curl tirent les mêmes octets simultanément. Un run de 4 secondes remplace une boucle série de 11 minutes — le pipe applique la backpressure aux lecteurs lents sans bloquer les autres.
Il n'y a pas de table d'état de campagne à consulter. Si le run meurt avant que les 200 ne se connectent, le TTL du pipe évince la moitié non terminée et le prochain tick cron re-rend. Pas de double-livraison, pas de batch à moitié envoyé à réconcilier.
Le script se réveille une fois par semaine, tourne quatre secondes, et le conteneur retourne au repos. vous payez les quatre secondes — pas un service de campagne always-on, pas une facture SES par destinataire, pas un siège Mailchimp.
Mêmes 200 destinataires, même corps de digest. C'est la forme du run qui bouge — de minutes-de-SMTP-en-série à secondes-de-HTTP-parallèle.
Temps mur du tick cron à la dernière livraison. Le pipe stream vers les 200 receivers en parallèle ; le frein devient le SMTP de l'abonné le plus lent, pas la boucle.
Le corps du digest est calculé une fois. Le pipe forwarde les mêmes octets vers chaque receiver — pas de re-rendu de template par destinataire, pas de facturation par destinataire, pas de cache par destinataire.
La Hoody Pipe API plafonne n à 256. Un digest hebdo à 200 reste confortablement sous la limite — et un lecteur lent applique la backpressure sans bloquer les autres.
Limites d'après la Hoody Pipe API : nombre de receivers 1–256, TTL pipe de 5 minutes en attente de connexions, 1000 transferts actifs côté serveur. L'entrée cron elle-même est une ligne dans /users/root/entries avec schedule, command, et un expires_at optionnel.
Quatre moments. Chacun est un seul appel HTTP que vous feriez à la main. Le cron est le réveil ; l'exec est le moteur de rendu ; le pipe est le câble ; la boucle est la seule chose que l'agent écrit.
L'entrée gérée sur /users/root/entries se déclenche. Schedule : 0 9 * * 1. Command : bash /scripts/digest.sh. Le crontab lui-même est un seul enregistrement JSON — pas un DAG Airflow, pas un service de workflow.
Le script exec tire les données de la semaine, rend le markdown, le convertit en HTML, et écrit le corps sur stdout. Un rendu, un payload — pas de boucle de mail-merge par destinataire.
Le script pipe stdout dans curl -T - vers pipe/digest-monday?n=200. Le pipe retient l'upload jusqu'à ce que 200 receivers se connectent, puis stream le corps à tous en parallèle.
Deux cents boucles curl le même chemin et passent le corps au SMTP de leur abonné. Les lents reçoivent de la backpressure. Les rapides finissent en millisecondes. Tout le run est terminé en quelques secondes.
Une entrée cron, un conteneur, deux cents destinataires.
Les outils standards qu'on dégaine quand on veut envoyer le même mail à une liste. Chacun vous facture un palier de service pour ce qui est, au fond, un rendu et une boucle HTTP de fan-out.
Lundi 9h, ça voulait dire un worker qui mouline du SMTP. Maintenant ça veut dire un tick cron, un conteneur, et un pipe qui fait le reste.