Halo, Habr! Saya sajikan kepada Anda terjemahan artikel "Pattern: Saga" oleh Chris Richardson.
Situasi
Ada aplikasi yang menerapkan pola basis data per layanan . Sekarang setiap layanan aplikasi memiliki database sendiri. Beberapa transaksi bisnis mencakup beberapa layanan sekaligus, sehingga diperlukan mekanisme untuk memastikan konsistensi data antara layanan ini.
Sebagai contoh: mari kita bayangkan bahwa kita sedang mengembangkan toko online di mana klien memiliki batas kredit. Aplikasi harus memastikan bahwa pesanan baru tidak melebihi batas kredit pelanggan. Karena Pesanan dan Pelanggan adalah basis data yang berbeda, aplikasi tidak dapat menggunakan transaksi ACID lokal.
Masalah
Bagaimana memastikan konsistensi data antar layanan?
Solusi
Setiap transaksi bisnis yang mencakup beberapa layanan perlu diimplementasikan sebagai hikayat.
Saga adalah kumpulan transaksi lokal. Setiap transaksi lokal memperbarui basis data dan menerbitkan pesan atau peristiwa, memulai transaksi lokal berikutnya dalam kisah tersebut. Jika transaksi gagal, misalnya, karena pelanggaran aturan bisnis, maka saga meluncurkan transaksi kompensasi yang memutar kembali perubahan yang dilakukan oleh transaksi lokal sebelumnya.

Ada dua cara untuk mengoordinasikan kisah-kisah:
- Koreografi - Setiap transaksi menerbitkan peristiwa yang memicu transaksi di layanan lain.
- Orkestrasi - Orkestrator memberi tahu para peserta transaksi mana yang harus dimulai.
Contoh: Saga Berbasis Koreografi

Di toko online menggunakan saga berbasis koreografi, membuat pesanan akan mencakup langkah-langkah berikut:
Order Service ( )
membuat Order ()
dalam status menunggu keputusan (pending) dan menerbitkan acara OrderCreated ()
Customer Service ( )
menerima suatu peristiwa dan mencoba untuk memesan kredit untuk pesanan. Kemudian menerbitkan salah satu dari dua acara: CreditReserved ()
atau CreditLimitExceeded ()
Order Service ( )
menerima acara dan mengubah status pesanan menjadi disetujui (dikonfirmasi) atau dibatalkan (dibatalkan)
Contoh: Saga Orkestra

Di toko online menggunakan saga berbasis orkestrasi, membuat pesanan akan mencakup langkah-langkah berikut:
Order Service ( )
membuat Order ()
dalam status menunggu keputusan (pending) dan membuat CreateOrderSaga ()
CreateOrderSaga ()
mengirim perintah ReserveCredit ()
ke Customer Service ( )
Customer Service ( )
mencoba untuk memesan pinjaman untuk pesanan dan mengirimkan kembali responsCreateOrderSaga ()
menerima respons dan mengirimkan perintah ApproveOrder ()
atau RejectOrder ()
di Order Service ( )
Order Service ( )
mengubah status pesanan menjadi disetujui (dikonfirmasi) atau dibatalkan (dibatalkan)
Saga memiliki keunggulan sebagai berikut
- Mengizinkan aplikasi menjaga konsistensi data antar layanan tanpa menggunakan transaksi yang didistribusikan.
Kisah ini memiliki kelemahan sebagai berikut
- Model pemrograman menjadi lebih kompleks. Misalnya, pengembang harus merancang transaksi kompensasi yang mengembalikan perubahan yang dibuat sebelumnya dalam saga.