Mandantenbezogene Warteschlangen
Hält verzögerte und geplante Arbeit beim richtigen Mandanten und aktuellen Rechten auch in langlebigen gemeinsamen Workern.
multi-tenant-queues-scheduling
Teammitglieder mit diesem Skill
Wann ist der Skill hilfreich?
Nutze ihn bei mandantenübergreifend genutzten Warteschlangen oder geplanten Aktionen mit inzwischen verändertem Zugriff.
Wobei hilft er dir?
- Verlangt explizite Mandantenkennung für jeden zugehörigen Auftrag.
- Erstellt und beendet Kontext für jede Worker-Ausführung getrennt.
- Prüft Mitgliedschaft und Nutzungsrechte erneut und isoliert Planungsfehler.
Das könntest du fragen
Verarbeite zwei Mandanten mit einem Worker ohne Kontextreste des vorherigen Mandanten. Lass den ersten Mandantenauftrag scheitern und führe danach den zweiten aus. Kontextbereinigung läuft trotzdem; das zweite Ergebnis enthält nur eigene Datensätze.
Ausführliche Dokumentation
Hier findest du die ursprüngliche Anleitung, Beispiele und Prüfschritte des Skills in ihrer Originalsprache.
Weniger anzeigen
Multi-Tenant Queues & Scheduling
When to Use
Use when designing or debugging background jobs, message queues, event subscribers, webhook dispatchers, or scheduled/cron workflows in a multi-tenant system.
1. Mandatory Tenant Envelope on Every Queued Job
Background workers run outside the HTTP request lifecycle. A job without an explicit tenant envelope is a data-leak or crash waiting to happen:
- Required Job Payload Schema:
interface TenantJobEnvelope<T> { tenantId: string; // Mandatory workspace/tenant identifier actorId: string | null; // User or service principal who triggered the job actorType: 'user' | 'api_key' | 'system'; enqueuedAt: string; // ISO timestamp correlationId: string; // Trace/request ID payload: T; } - Reject job enqueue calls for tenant-scoped job types if
tenantIdis missing.
2. Worker Context Initialization, Cleanup & State Hygiene
Long-lived worker processes execute jobs for Tenant A, then Tenant B, then Tenant C sequentially or concurrently in the same OS process:
- Per-Job Context Scope: Wrap every job execution in a fresh
AsyncLocalStorage.run(jobTenantContext, ...)(orcontextvars/ DB transactionSET LOCAL app.current_tenant_id) and ensure context exits cleanly intry / finally. - Zero Worker-Global Mutable State: Never cache tenant data, auth clients, or temp files on module-level variables inside a worker without keying by
tenantIdand cleaning up after the job finishes.
3. Time-of-Check vs. Time-of-Execution (TOCTOU) Re-Verification
A job enqueued today (or scheduled for 24 hours later) may execute after:
- The workspace was
suspendedordeleted. - The workspace's subscription lost entitlement to the feature.
- The user who scheduled the action was removed from the workspace or had their role downgraded.
At the start of worker execution, re-verify:
- The workspace exists and is
active(ifsuspendedordeleted, abort/cancel the job cleanly without retrying). - For user-attributed delayed mutations (exports, scheduled sends, bulk edits), verify whether the initiating user or token still holds permission according to the domain policy.
4. Fan-Out Scheduling Pattern for Cron Jobs
Never run a single monolithic cron query that loads all rows across all 5,000 workspaces into one giant in-memory array (SELECT * FROM items WHERE due_at < NOW()):
- One corrupt record or slow external API in
Workspace #42will crash or block the cron job for all other 4,999 workspaces! - Dispatcher $\rightarrow$ Per-Tenant Job Fan-Out:
- The scheduler queries only active
workspace_ids that have due work (SELECT DISTINCT workspace_id ...). - It enqueues an isolated per-workspace job (
process-tenant-digest,{ tenantId }) with deterministic idempotency key (digest:${tenantId}:${dateWindow}). - Each workspace job runs in its own isolated tenant context, transaction, and error boundary.
- The scheduler queries only active
5. Noisy-Neighbor Fairness & Per-Tenant Concurrency Limits
Prevent a single tenant enqueueing 50,000 jobs from starving all other tenants:
- Enforce per-tenant rate limits or per-tenant active concurrency caps in the queue consumer, or separate fast interactive queues from bulk batch queues.
Enthaltene Dateien 1
SKILL.md
