Study
Akka

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.

Editor Latihan

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.