Motor generic pentru procese cu mai multi pasi care nu incap intr-o tranzactie. Garantia nu e atomicitatea, ci compensarea in ordine inversa. - saga-registry: definitii versionate in cod, backoff exponential plafonat - saga-runner: corelator outbox->instanta, step runner, timeout, retry, compensare; revendicare cu FOR UPDATE SKIP LOCKED ca doua procese sa nu avanseze aceeasi saga simultan - idempotenta la pornire prin index unic (saga, versiune, trigger_event), nu prin SELECT-apoi-INSERT care ar avea race - compensarea are propriul retry: o compensare esuata lasa sistemul mai rau decat esecul original - monitor /v1/sagas cu instante blocate si retry manual care NU sare pasi - prima saga reala: imbogatire research brief, fara pas AI (un apel AI automat per brief ar schimba profilul de cost)
26 lines
1 KiB
TypeScript
26 lines
1 KiB
TypeScript
import { Module, OnModuleInit } from '@nestjs/common';
|
|
import { IntelligenceModule } from '../intelligence/intelligence.module';
|
|
import { IntelligenceService } from '../intelligence/intelligence.service';
|
|
import { registerResearchBriefEnrichment } from './research-brief-enrichment.saga';
|
|
import { SagaRunnerService } from './saga-runner.service';
|
|
import { SagasController } from './sagas.controller';
|
|
import { SagasService } from './sagas.service';
|
|
|
|
@Module({
|
|
imports: [IntelligenceModule],
|
|
controllers: [SagasController],
|
|
providers: [SagaRunnerService, SagasService],
|
|
exports: [SagaRunnerService],
|
|
})
|
|
export class SagasModule implements OnModuleInit {
|
|
constructor(private readonly intelligence: IntelligenceService) {}
|
|
|
|
/**
|
|
* Sagas se inregistreaza la bootstrap, nu la import: definitia are nevoie de
|
|
* servicii injectate, iar registrul trebuie sa fie complet inainte ca primul
|
|
* tur de corelator sa ruleze.
|
|
*/
|
|
onModuleInit(): void {
|
|
registerResearchBriefEnrichment(this.intelligence);
|
|
}
|
|
}
|