In grootschalige multi-tenant omgevingen wordt het beheren van tientallen uiteenlopende achtergrondtaken — variërend van geautomatiseerde QA-audits en commerciële lead-discovery tot OAuth-e-mailroutering en gedistribueerde contentsynchronisatie — al snel onbeheersbaar wanneer deze als losse cronjobs of ad-hoc scripts draaien. Zonder een centraal orkestratieframework lopen langlopende processen het risico om weesprocessen (orphan processes) achter te laten, CPU-kernen volledig te verzadigen en elke vorm van realtime observability te verliezen.
Om deze architecturale uitdaging op te lossen, ontwikkelden wij Job Runner v2.0: een veerkrachtig Node.js- en TypeScript-automatiseringsplatform gebouwd op een modulaire pluginarchitectuur. Door strikt getypeerde subsystemen te definiëren, consolideerde de Job Runner drie voorheen gescheiden engines — QA Watchdog, Lead Hunter en Article Sync — binnen één proces-geïsoleerd platform op onze worker-node (192.168.11.18:8084).
1. Het Probleem van Gefragmenteerde Achtergrondscripts
Vóór de consolidatie onder een centrale runner opereerde elke operationele tool in een eigen silo:
- QA Watchdog: Startte losstaande headless Playwright-spiders om HTTP 404-links op te sporen, dynamische contactformulieren te testen en JSON-LD-schema's te valideren op meer dan 130 productiedomeinen.
- Lead Hunter: Voerde meerstaps-discoveryloops uit over regionale bedrijfsregisters, verstuurde gepersonaliseerde technische audits via de Google Gmail API en synchroniseerde leads met Frappe CRM.
- Article Sync & SEO-indexering: Draaide geplande import-/exporttaken om flat-file JSON-shards te synchroniseren met MongoDB Atlas en nieuwe URL's direct aan te bieden bij IndexNow-zoekmachine-endpoints.
Wanneer dergelijke scripts via losgekoppelde SSH-sessies of standaard systeem-crons werden gestart, konden onafgehandelde promise-rejections of oneindige parser-loops CPU-kernen voor onbepaalde tijd op 100% vastzetten.
2. De Modulaire Plugin-Architectuur in TypeScript
Job Runner v2.0 lost dit op door elk operationeel domein onder te brengen in een strikt getypeerde module onder src/modules/ via één declaratief contract:
export interface JobDef {
key: string;
name: string;
description: string;
queue: 'qa' | 'lead-hunter' | 'seo' | 'maintenance' | 'social';
bin: 'node' | 'bash';
script: string;
cwd: string;
baseArgs: string[];
schedule?: string;
retries: number;
logFile: string;
}
A. Integratie van QA-Watchdog (src/modules/qa/)
Alle geautomatiseerde testsuites zijn gemigreerd naar native TypeScript-spiders: de 404 Fast Spider (qa:spider) controleert HTTPS-responscodes en 301-redirects, Contact Form Liveness (qa:contact-forms) valideert publieke formulieren, de Static Asset Auditor (qa:asset-audit) controleert CSS- en JS-bundels, en de SEO Schema Validator (qa:seo-audit) inspecteert ruim 3.400 artikelen op gestructureerde JSON-LD-metadata.
B. Integratie van Lead-Hunter (src/modules/marketing/)
De commerciële discovery-engine werkt als een deterministische vijftraps-pijplijn: regionale MKB-discovery, technische foutanalyse (ontbrekende SSL, trage LCP, gebroken viewport), deduplicatie in Frappe CRM v15 via REST API, OAuth-verzending via de Google Gmail API-microservice op poort 8085 en automatische verwerking van bouncemeldingen.
C. Integratie van Article Sync & Versioned Content Engine (src/modules/content/)
Contentsynchronisatie maakt gebruik van atomaire dual-writing tussen JSON-shards op schijf, de SQLite-revisiedatabase (data/revisions.db) en MongoDB, inclusief onveranderlijke revisiesnapshots (v1 → v2) en directe IndexNow-notificaties.
3. Harde POSIX-Procesgroep-Isolatie & Telemetrie
Om CPU-verzadiging en achterblijvende Chromium-processen te voorkomen, dwingt Job Runner twee cruciale stabiliteitsinvarianten af:
- Procesgroep-Sandboxing (
-pid): Wanneer een taak wordt gestopt of een time-out bereikt, stuurt Job RunnerSIGTERM/SIGKILLnaar het negatieve procesgroep-ID (process.kill(-child.pid, 'SIGTERM')), zodat alle dochterprocessen (inclusief headless Chromium-instanties) gegarandeerd worden afgesloten. - Dual-Push Telemetrie: Alle joblogs en levenscyclusstatistieken worden realtime gestreamd naar Prometheus en Promtail/Loki, wat zorgt voor overzichtelijke Grafana-dashboards op zowel de primaire webserver (
.32) als de worker-node (.18).
| Subsysteem-wachtrij | Modulepad | Concurrencylimiet | Isolatie- & Herstelmechanisme | Primaire Telemetrie-sink |
|---|---|---|---|---|
qa |
src/modules/qa/ |
2 parallelle spiders | POSIX -pid groeps-kill + 15 min watchdog-time-out |
Loki {job="qa_watchdog"} + Prometheus |
lead-hunter |
src/modules/marketing/ |
1 seriële pijplijn | Idempotente Frappe CRM-deduplicatie + OAuth-retry | Loki {job="lead_hunter"} + CRM-webhook |
seo / maintenance |
src/modules/content/ |
4 atomaire workers | SHA-256 revisie-lock + SQLite/MongoDB dual-write | Loki {job="cms_sync"} + IndexNow HTTP 200 |
4. Conclusie
Door QA-validatie, marketingautomatisering en contentsynchronisatie samen te brengen in één modulaire TypeScript-pluginarchitectuur, hebben wij kwetsbare achtergrondscripts getransformeerd tot een robuuste enterprise-automatiseringsengine met volledige operationele zichtbaarheid.
