Persistence Dasar (Event Sourcing Konsep, Akka Persistence)
Penjelasan
Actor biasa kehilangan seluruh state-nya kalau di-restart atau JVM mati, karena state hanya hidup di memori. Akka Persistence (modul `akka-persistence-typed`) mengatasi ini lewat pola event sourcing: alih-alih menyimpan state akhir langsung, setiap perubahan direkam sebagai 'event' immutable ke journal (penyimpanan append-only, bisa database atau file), dan state actor saat ini adalah hasil me-replay seluruh event tersebut secara berurutan sejak awal. Actor persistence (`EventSourcedBehavior`) punya tiga bagian utama: `commandHandler` yang memvalidasi command lalu menghasilkan event (tapi TIDAK mengubah state langsung), `eventHandler` yang benar-benar menerapkan event ke state, dan `emptyState` sebagai state awal sebelum ada event apapun. Keuntungan pola ini: riwayat perubahan lengkap tersimpan (berguna untuk audit), dan actor bisa 'dipulihkan' persis seperti sebelum crash dengan me-replay event dari journal. Untuk mempercepat pemulihan pada actor dengan riwayat event sangat panjang, Akka Persistence mendukung snapshot — menyimpan state pada titik waktu tertentu supaya replay tidak perlu dari event paling awal.
Contoh Konsep
import akka.persistence.typed.PersistenceId
import akka.persistence.typed.scaladsl.{EventSourcedBehavior, Effect}
object AkunBank {
sealed trait Command
case class Setor(jumlah: Int) extends Command
sealed trait Event
case class Disetor(jumlah: Int) extends Event
case class State(saldo: Int)
def apply(id: String) = EventSourcedBehavior[Command, Event, State](
persistenceId = PersistenceId.ofUniqueId(id),
emptyState = State(0),
commandHandler = (state, command) => command match {
case Setor(jumlah) => Effect.persist(Disetor(jumlah))
},
eventHandler = (state, event) => event match {
case Disetor(jumlah) => state.copy(saldo = state.saldo + jumlah)
}
)
}
Praktikum
Lengkapi actor persistence InventoriGudang dengan command TambahStok(jumlah) yang menghasilkan event StokDitambah(jumlah), dan eventHandler yang menambah state.jumlahStok.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Jangan pernah mengubah tipe atau makna event yang sudah pernah dipersist di production tanpa strategi migrasi (event adapter/versioning) — journal lama berisi event versi sebelumnya, dan actor harus tetap bisa me-replay-nya dengan benar saat startup berikutnya.