Sobes.tech
Middle — Middle+

Kuidas rakendada Saga muster jaotatud tehingute haldamiseks mikroteenuste arhitektuuris?

sobes.tech AI

Vastus AI-lt

Saga muster on kasutatav hajutatud tehingute haldamiseks mikroteenuste arhitektuuris, kus traditsioonilised ACID-tehingud ei ole võimalikud andmete ja teenuste hajutamise tõttu.

Idee on see, et suur äriline operatsioon jaguneb mitmeks kohalikuks tehinguks erinevates teenustes. Iga kohalik tehing kaasneb kompenseeriva operatsiooniga, mis tühistab selle mõju mis tahes sammu jooksul, kui tekib viga.

Go-süsteemi rakendamine põhineb tavaliselt orkestratoril või koreograafial:

  • Orkestrator: tsentraliseeritud teenus, mis haldab sammude järjestust ja kutsub kohalikud tehingud, tegeleb vigadega ning käivitab kompenseerivad tehingud.
  • Koreograafia: iga teenus avaldab sündmusi ühe sammu täitmise kohta, teised teenused reageerivad neile, tehes oma samme või kompenseerivaid tegevusi.

Lihtsustatud orkestratsiooni näide Go-s:

func RunSaga() error {
    if err := ServiceA.DoStep(); err != nil {
        return err
    }
    if err := ServiceB.DoStep(); err != nil {
        ServiceA.Compensate() // esimese sammu tühistamine
        return err
    }
    if err := ServiceC.DoStep(); err != nil {
        ServiceB.Compensate()
        ServiceA.Compensate()
        return err
    }
    return nil
}

Reaalses süsteemis kasutatakse sõnumijadasid (Kafka, RabbitMQ) sündmuste edastamiseks ja saga oleku haldamiseks ning saga oleku salvestamist andmebaasis tõrkeid taluvuse tagamiseks.