
Sechzig Container auf einem Server
Eine Bare-Metal-Box führt Dutzende bis Hunderte von Hoody-Containern aus. KSM und BTRFS-Dedup machen die Marginalkosten nahezu null.
Deine Kunden tippen den Cron-Ausdruck. Du POSTest ihn an die crontab ihres Containers. Es gibt keine geteilte Queue zum Fair-Sharen, kein Mindestintervall durchzusetzen, kein Support-Ticket über „warum mein Job am Spitzen-Montag nicht lief".
Eine echte kundenseitige Settings-Seite — Zeitpläne vom Tenant editiert, vom Container geparst.
Deine Settings-Seite rendert ein Eingabefeld. Sein Tenant-Container exponiert eine Cron-API. Submit leitet einen POST weiter. Kein globaler Scheduler, keine Per-Tenant-Filter-Logik, kein „max 100 Jobs über alle Kunden"-Cap.
// der Form-Submit leitet den Ausdruck des Kunden unverändert weiter
POST https://acme-cron.hoody.com/users/root/entries
Content-Type: application/json
{
"schedule": "0 9 * * 1-5",
"command": "/jobs/sync_crm.sh",
"comment": "Sync Salesforce contacts",
"enabled": true
}HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "sch_8a3f1c",
"schedule": "0 9 * * 1-5",
"next_run": "2026-05-04T09:00:00Z",
"enabled": true
}
// der Zeitplan ist jetzt in der crontab dieses Tenants und nirgendwo sonstDer Hoody-Cron-Service läuft in jedem Tenant-Container mit verwalteten Einträgen und Per-User-Isolation. Der Zeitplan lebt, wo die Arbeit läuft.
Wenn der Zeitplan neben der Arbeit lebt, ändern sich die Regeln des Multi-Tenant-Schedulings. Die Constraints sind lokal. Der Blast Radius ist lokal. Die Features sind lokal.
Es gibt keinen globalen Thread-Pool, um den man kämpft. Dein anspruchsvollster Tenant läuft jede Minute und lässt deine ruhigen nie verhungern — sie sind nicht auf derselben crontab.
Du hörst auf, der Gatekeeper zu sein, der entscheidet „ist */1 * * * * für deinen Tier erlaubt?" Sein Container, sein Cron, seine CPU-Rechnung. Dein Support-Posteingang leert sich.
Snapshotte den Tenant-Container, du snapshottest die crontab. Rollback, Restore, Fork — die Zeitpläne kommen mit. Kein externer Scheduler-State zu syncen.
Der Unterschied zeigt sich an drei Stellen: in der Erfahrung des Kunden, deiner Support-Last und der Engineering-Oberfläche.
Die Geteilter-Scheduler-Version dieses Features ist ein Meer aus Vorbehalten. Die BYO-Version ist ein Eingabefeld mit fünf Feldern.
Drei Zahlen, die sich an dem Tag ändern, an dem du aufhörst, eine globale Queue zu betreiben. Jede entspricht einem Feature, das du nicht mehr schreiben oder betreiben musst.
Kein Tier-gegatetes Mindestintervall mehr, kein Max-Jobs-pro-Tenant, keine Fair-Share-Knöpfe. Der Container ist das Limit.
Kunde tippt, du leitest weiter, der Container parst. Der Settings-Seiten-Submit ist ein einziger REST-Call, keine Orchestrierung.
Minute · Stunde · Tag-des-Monats · Monat · Wochentag. Plus Makros (@hourly, @daily). Standard-POSIX, keine deine DSL.
Zahlen spiegeln das BYO-Container-gebundene Modell wider — tatsächliche Cron-Einträge skalieren mit der CPU jedes Containers und dem Plan des Kunden.
Der Cron-Ausdruck des Kunden ist seiner, nicht deiner zum Validieren gegen eine globale Queue.
Die Infrastruktur-Stücke, die ein BYO-Container-gebundener Cron leise in den Ruhestand schickt.
Hör auf, der Gatekeeper für jemand anderes Zeitplan zu sein. Übergib ihm das Cron-Feld, übergib die Arbeit seinem Container.