Timeout a kompenzace
Sklad neodpověděl do 30 s – sága objednávku zamítne; když rezervace dorazí pozdě, zboží se vrátí.
Na této stránce
Shrnutí: Objednávka nesmí viset věčně. Když sklad neodpoví do
Sagas:ReservationTimeoutSeconds(30 s), hlídač ji zamítne. Pokud sklad mezitím zboží přece jen zarezervoval, sága pošleReleaseStockV1– kompenzace.
Scénář: sklad byl chvíli mimo provoz
sequenceDiagram
autonumber
participant SG as OrderSagaOrchestrator
participant TW as OrderSagaTimeoutWorker
participant ODB as ordering.db
participant MQ as RabbitMQ
participant I as Inventory.Api (nejede)
SG->>MQ: ReserveStockV1
Note over MQ,I: zpráva čeká ve frontě minishop.inventory
loop každých 5 s
TW->>ODB: ságy AwaitingReservation po termínu?
end
TW->>SG: TimeOutAsync(orderId) – vlastní trasa
SG->>SG: saga → Rejected („Sklad neodpověděl včas.“)
SG->>ODB: COMMIT: Order Rejected, OrderRejected
Note over I: sklad naběhne a zpracuje frontu
MQ->>I: ReserveStockV1
I->>I: zarezervovat (zboží je)
I->>MQ: StockReservedV1 (pozdě!)
MQ->>SG: StockReservedV1
SG->>SG: saga Rejected + StockReserved → ReleasingStock
SG->>MQ: ReleaseStockV1 (kompenzace)
MQ->>I: ReleaseStockV1
I->>I: vrátit zboží podle rezervací
I->>MQ: StockReleasedV1
MQ->>SG: StockReleasedV1
SG->>SG: saga → Released (konec)
Co si všimnout
- Zprávy se neztratí – i když sklad neběží, příkaz čeká ve frontě RabbitMQ.
- Objednávka se nevrací do hry. Zamítnutí platí; pozdní rezervace se jen napraví vrácením zboží.
- Souběh timeoutu a odpovědi: když přijdou současně, sága má concurrency token (
Version) – jeden zápis vyhraje, druhý se zopakuje nad novým stavem a zjistí, že už nemá co dělat. - Timeout začíná novou trasu – v dashboardu není pod původním požadavkem (nevyvolal ho uživatel).
Vyzkoušejte
- Spusťte aplikaci, zastavte
inventory-api(v Aspire dashboardu tlačítkem Stop). - Vytvořte objednávku → po ~30 s je
Rejected(„Sklad neodpověděl včas.“). - Spusťte sklad znovu → v auditním logu uvidíte
StockReservedV1, pakReleaseStockV1aStockReleasedV1.
Kód
OrderSagaTimeoutWorker · OrderSaga · ReleaseStockHandler · testy ságy