Study
Akka

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.

Editor Latihan

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.