El PDF que se come un core
OCR, transcodificación, parseos grandes — el trabajo CPU-bound corre en su isolate mientras el event loop principal sigue sirviendo tráfico.
Corre lógica pesada o no confiable en isolates V8 dedicados. Un crash en un worker jamás tumba el host. Cuando un worker termina, el OS recupera el 100% de su memoria — le decimos la Guillotina.
Cada worker corre en su propio worker thread de Node.js con un heap V8 privado. Las variables son privadas, la memoria está aislada, y la muerte del hilo no es la muerte del proceso — la confiabilidad y la capacidad de respuesta dejan de competir con tu lógica de negocio.
Una máquina de estados estricta gobierna cada instancia: INACTIVE → ACTIVE_FOREGROUND / ACTIVE_BACKGROUND → SUSPENDED → TERMINATING → TERMINATED. Cada instancia tiene un pid y un alias, direccionable globalmente o por nombre. Spawn, activate, suspend, resume, signal, stop — el ciclo de vida es el API.
La comunicación usa un protocolo de correlation-ID: cada comando lleva un id monotónico de mensaje, y cada respuesta resuelve exactamente su promesa. Varios comandos pueden estar en vuelo sin mezclar jamás sus respuestas.
class InvoiceWorker extends BaseWorker {
async activateBackground(ctx) {
const { payload, logger } = ctx;
logger.info('Procesando…');
const result = await this.settle(payload);
return { ok: true, data: result, port: 'done' };
}
}
// spawn → activate → stop. La memoria vuelve a cero. OCR, transcodificación, parseos grandes — el trabajo CPU-bound corre en su isolate mientras el event loop principal sigue sirviendo tráfico.
Corre la lógica de integración en un worker. Si fuga memoria, se cuelga o muere, la guillotina limpia y el host ni se entera.
Workers efímeros nacen, corren y terminan. Como la recuperación de memoria es total, el job diez mil corre igual que el primero.