Study
Akka

Ask Pattern (Request-Response dengan Future)

Penjelasan

Berbeda dari `tell` yang fire-and-forget, kadang kita butuh menunggu balasan dari actor, misalnya saat memanggil actor dari kode non-actor (HTTP handler, test, dsb). Untuk ini Akka menyediakan ask pattern lewat operator `?`. Pola ini mengharuskan pesan yang dikirim menyertakan `ActorRef[Balasan]` sebagai 'alamat pengembalian' — biasanya lewat parameter bertipe `ActorRef[Balasan] => Pesan`. Akka lalu membuat actor sementara di belakang layar untuk menampung balasan, dan mengembalikan hasilnya sebagai `Future[Balasan]` ke pemanggil. Ask membutuhkan `Timeout` implisit karena jika actor tujuan tidak pernah membalas, Future akan gagal setelah durasi timeout tercapai (bukan menunggu selamanya). Ask pattern paling umum dipakai untuk komunikasi antara dunia actor dan dunia non-actor (misalnya endpoint HTTP Akka HTTP yang mengembalikan response berbasis Future), tapi di dalam actor-ke-actor sebaiknya tetap pakai tell biasa supaya tidak memblokir mailbox dengan menunggu balasan.

Contoh Konsep

import akka.actor.typed.{ActorRef, ActorSystem, Behavior}
import akka.actor.typed.scaladsl.{AskPattern, Behaviors}
import akka.util.Timeout
import scala.concurrent.duration._
import scala.concurrent.Future

object Penjumlah {
  sealed trait Pesan
  case class Jumlahkan(a: Int, b: Int, balasKe: ActorRef[Int]) extends Pesan

  def apply(): Behavior[Pesan] = Behaviors.receiveMessage {
    case Jumlahkan(a, b, balasKe) =>
      balasKe ! (a + b)
      Behaviors.same
  }
}

object ContohAsk {
  def tanya(system: ActorSystem[Penjumlah.Pesan], target: ActorRef[Penjumlah.Pesan]): Future[Int] = {
    import AskPattern._
    implicit val timeout: Timeout = 3.seconds
    implicit val sched = system.scheduler
    target.ask(balasKe => Penjumlah.Jumlahkan(2, 3, balasKe))
  }
}

Praktikum

Lengkapi actor Validator yang menerima pesan CekUmur(umur: Int, balasKe: ActorRef[Boolean]) dan membalas true jika umur >= 18, lalu lengkapi function tanya yang memakai ask pattern untuk memanggilnya.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Jangan pakai ask di dalam actor lain untuk komunikasi rutin antar actor — ini menambah overhead dan bisa membuat kode terasa seperti pemrograman sinkron biasa, padahal kekuatan Akka justru ada di komunikasi asinkron lewat tell.