Routing Pesan (Round-Robin/Broadcast Router)
Penjelasan
Ketika ada banyak pekerjaan sejenis yang bisa diproses paralel oleh beberapa actor identik, Akka menyediakan router untuk mendistribusikan pesan ke kumpulan actor (disebut routee) tanpa pengirim perlu tahu detail pembagian kerja. Akka Typed menyediakan dua jenis pool router utama: `Routers.pool` dengan strategi round-robin (default) yang membagi pesan bergiliran ke tiap routee secara merata, dan strategi broadcast yang mengirim salinan pesan yang sama ke SEMUA routee sekaligus (dipakai lewat `Behaviors.receiveMessage` dengan pengiriman manual, atau `Routers.pool(...).withBroadcastPredicate` tergantung kebutuhan). Router dibuat dengan `Routers.pool(jumlahRoutee)(behaviorPekerja)` lalu di-spawn seperti actor biasa, menghasilkan satu `ActorRef` yang mewakili seluruh pool — pengirim cukup mengirim pesan ke ActorRef router ini, dan router yang menentukan routee mana yang menerimanya. Pola ini berguna untuk load balancing kerja CPU-intensif atau I/O paralel, seperti memproses banyak file atau request secara bersamaan tanpa membuat satu actor jadi bottleneck.
Contoh Konsep
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.{Behaviors, Routers}
object PekerjaHitung {
sealed trait Pesan
case class Hitung(n: Int) extends Pesan
def apply(): Behavior[Pesan] = Behaviors.receive { (context, pesan) =>
pesan match {
case Hitung(n) =>
println(s"${context.self.path.name} menghitung kuadrat dari $n = ${n * n}")
Behaviors.same
}
}
}
object SistemRouter {
def apply(): Behavior[PekerjaHitung.Pesan] = Behaviors.setup { context =>
val pool = Routers.pool(poolSize = 4)(PekerjaHitung())
val router = context.spawn(pool, "router-hitung")
(1 to 10).foreach(i => router ! PekerjaHitung.Hitung(i))
Behaviors.empty
}
}
Praktikum
Buat pool router round-robin dengan 3 routee dari actor PengirimEmail, lalu kirim 5 pesan KirimEmail ke router tersebut.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Router round-robin cocok untuk kerja paralel independen, tapi kalau routee butuh state bersama atau urutan pemrosesan penting, router bukan solusi tepat — pertimbangkan pola lain seperti single actor dengan antrian internal.