Povedz mi o vzorec Transactional Outbox — čo je a na čo sa používa?
sobes.tech AI
Odpoveď od AI
Transactional Outbox je vzor, ktorý pomáha zabezpečiť atomickosť zápisu dát a odosielania správ v distribuovaných systémoch.
Problém: ak máte operáciu, ktorá mení údaje v databáze a musí odoslať udalosť (napríklad do fronty správ), tieto dve operácie — zápis do databázy a odoslanie správy — zvyčajne nie sú atomické. Ak databáza bola aktualizovaná, ale správa nebola odoslaná (alebo naopak), systém sa dostane do nekonzistentného stavu.
Riešenie: pri zmene dát v rámci transakcie sa zaznamená nielen hlavná informácia, ale aj špeciálna tabuľka "outbox" s udalosťami, ktoré je potrebné odoslať. Po úspešnom potvrdení transakcie tento proces číta túto tabuľku a odosiela správy do fronty. Tým je zabezpečené, že udalosť nezmizne a nebude odoslaná dvakrát.
Príklad:
// V transakcii
tx.Exec("INSERT INTO orders ...")
tx.Exec("INSERT INTO outbox (event_type, payload) VALUES (?, ?)")
// Po potvrdení transakcie číta samostatný worker outbox a publikuje udalosti