
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.
Dein SaaS lässt jeden Kunden seine eigene Report-Generierung schedulen. Das naive Design ist ein gemeinsamer Scheduler, Kunden-IDs im Job-Payload, Daumen drücken, dass niemand andere aushungert. Das Hoody-Design gibt jedem Tenant seinen eigenen Container und seinen eigenen hoody-cron-Service.
Three lifecycle states, one HTTP API. PROVISION adds entries, cron ticks run them, DELETE suspends. Each tenant's cron lives in its own container — no shared queue, no noisy-neighbor risk.
Jeder Customer-Container exposed die hoody-cron-HTTP-API. Provisioning mit POST, Überprüfung mit GET, Suspend mit DELETE. Keine geteilte Queue, keine Priority-Lane, keine Scheduler-Config zum Redeploy.
# 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"
}Jeder Tab zeigt den exakten API-Aufruf, den deine Control-Plane macht. Die Managed-Entries-API nutzt UUIDs, um einzelne Jobs ohne komplette Crontab-Replacement anzusprechen. Pro-User-Isolation bedeutet, dass nichts über acme-corps Schedule für globex-saas sichtbar ist.
Ein Pauschal-Server. Sechzig Tenant-Container. Die Mathematik ist brutal einfach.
Wenn initech-incs scrape.js hängt, feuert acme-corps 9-Uhr-Digest trotzdem. Verschiedene Crontabs, verschiedene Process-Trees, verschiedene Filesystems.
POST einen neuen Entry und der hoody-cron-Service des Tenants nimmt ihn sofort auf. Kein zentraler Scheduler zum Reload, keine Broadcast nötig.
Wenn globex-saas fragt, warum ihr 18-Uhr-Rollup letzten Dienstag zweimal lief, liest du ein Container-Log — nicht einen geteilten Scheduler-Grep über neun Maschinen.
Drei Achsen, an denen das alte Design dein Team Steuern kostet — und das Hoody-Design einfach nicht.
Die alte Spalte ist, was jedes Team das erste Mal schreibt, wenn es Multi-Tenant-Scheduling shippt. Die neue Spalte ist, was du shippst, wenn die Plattform jedem Tenant standardmäßig einen eigenen Container gibt.
Was eine einzelne Bare-Metal-Hoody-Box leistet, wenn jeder Kunde seine eigene Crontab bekommt.
Sechzig Customer-Container auf einem Bare-Metal-Knoten, jeder mit eigenem laufenden hoody-cron-Service. Kein gemeinsamer Scheduler als Bottleneck.
Vom PUT-Request bis zum ersten Tick des neuen Schedules, beobachtet über eine Flotte von 60 Containern auf einem typischen 64-Core-Knoten.
Es gibt buchstäblich keine geteilte Queue, Priority-Lane oder Scheduler-Thread, um die zwei Tenants konkurrieren. Isolation ist das Substrat.
Kapazitätszahlen sind typische Werte, beobachtet auf einem 64-Core-/256GB-Bare-Metal-Knoten mit Standard-Hoody-Container-Dichte. Die tatsächliche Kapazität hängt von den Pro-Tenant-CPU- und Memory-Budgets sowie der Arbeit jedes Cron-Jobs ab. Die Null bei Cross-Tenant-Queues ist strukturell, kein Benchmark.
Ein Cron eines Kunden kann den eines anderen nicht aushungern, weil sie nicht in derselben Crontab stehen.
Die Architekturen, die Teams bauen, um eine Crontab über mehrere Tenants zu teilen. Hoody steckt jeden Tenant in seine eigene Crontab — kein Router, keine Fairness-Queue, kein Noisy Neighbour.
Hör auf, tenant_id überall hinzuschreiben. Gib jedem Kunden seinen eigenen Container und lass Cron tun, was Cron schon immer getan hat — in Isolation.