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.
votre SaaS laisse chaque client planifier sa propre génération de rapport. Le design naïf c'est un scheduler partagé, des customer IDs dans le payload du job, et on croise les doigts pour que personne n'affame personne. Le design Hoody donne à chaque tenant son propre conteneur et son propre service hoody-cron.
Trois états de cycle de vie, une API HTTP. PROVISION ajoute des entrées, le tic cron les exécute, DELETE suspend. Le cron de chaque tenant vit dans son propre conteneur — pas de file partagée, pas de risque de ressources partagées.
Chaque conteneur client expose l'API HTTP hoody-cron. Provisionne avec POST, vérifie avec GET, suspends avec DELETE. Pas de file partagée, pas de voie prioritaire, pas de config scheduler à redéployer.
# POST managed entry for acme-corp tenant
POST acme-cron.hoody.com/users/root/entries
Content-Type: application/json
{
"schedule": "0 9 * * *",
"command": "/usr/local/bin/digest.sh",
"comment": "daily digest",
"enabled": true
}HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "7d3f2a1b-8c4e-4f9a-b2d5",
"schedule": "0 9 * * *",
"schedule_human": "At 09:00",
"enabled": true,
"user": "root"
}Chaque onglet montre l'appel API exact que votre control plane fait. L'API d'entrées managées utilise des UUID pour que vous puissiez cibler des jobs individuels sans remplacer tout le crontab. L'isolation par utilisateur fait que rien de la planification d'acme-corp n'est visible pour globex-saas.
Un serveur forfaitaire. Soixante conteneurs tenants. Le calcul est brutalement simple.
Quand le scrape.js d'initech-inc plante, le digest 9h d'acme-corp se déclenche quand même. Crontabs différents, arbres de processus différents, filesystems différents.
POST une nouvelle entrée et le service hoody-cron du tenant la prend immédiatement. Aucun scheduler central à recharger, aucun broadcast à envoyer.
Quand globex-saas demande pourquoi son rollup de 18h a tourné deux fois, vous lisez le log d'un conteneur — pas un grep de scheduler partagé sur neuf machines.
Trois axes où le vieux design taxe votre équipe et où le design Hoody ne le fait juste pas.
La colonne ancienne, c'est ce que toute équipe écrit la première fois qu'elle livre une planification multi-tenant. La colonne nouvelle, c'est ce que vous livrez quand la plateforme donne à chaque tenant son propre conteneur par défaut.
Ce qu'une seule box bare-metal Hoody fait quand chaque client a son propre crontab.
Soixante conteneurs clients sur un nœud bare-metal, chacun avec son propre service hoody-cron. Pas de scheduler partagé qui sature.
De la requête PUT au premier tic de la nouvelle planification, observé sur une flotte de 60 conteneurs sur un nœud 64-cœurs typique.
Il n'y a littéralement aucune file partagée, voie prioritaire ou thread scheduler pour lequel deux tenants se disputent. L'isolation est le substrat.
Les chiffres de capacité sont des valeurs typiques observées sur un nœud bare-metal 64-cœurs / 256GB faisant tourner la densité de conteneurs Hoody standard. La capacité réelle dépend des budgets CPU et mémoire par tenant et du travail que chaque job cron fait. Le zéro en files cross-tenant est structurel, pas un benchmark.
Le cron d'un client ne peut pas affamer celui d'un autre parce qu'ils ne sont pas sur le même crontab.
Les architectures que les équipes construisent pour partager un crontab entre tenants. Hoody met chaque tenant dans son propre crontab — pas de routeur, pas de file d'équité, pas de ressources partagées.
Arrêtez d'écrire tenant_id partout. Donnez à chaque client son propre conteneur et laissez cron faire ce que cron a toujours fait, en isolation.