Study
Akka

Dispatcher & Thread Pool Tuning Dasar

Penjelasan

Actor sendiri tidak punya thread khusus — Akka memakai `Dispatcher` untuk memutuskan thread pool mana yang menjalankan actor saat memproses pesan dari mailboxnya. Dispatcher default (`akka.actor.default-dispatcher`) memakai fork-join pool yang cocok untuk kebanyakan kasus, karena mengalokasikan thread secara efisien berdasarkan jumlah core CPU. Namun ada situasi di mana dispatcher default kurang tepat, terutama saat actor melakukan operasi blocking seperti panggilan JDBC sinkron atau I/O file — operasi blocking di dispatcher default bisa 'mencuri' thread yang seharusnya dipakai actor lain, menyebabkan starvation di seluruh sistem. Solusinya adalah membuat dispatcher terpisah (biasanya `thread-pool-executor` dengan ukuran tetap) khusus untuk actor yang melakukan operasi blocking, dikonfigurasi lewat file `application.conf` lalu dirujuk saat spawn actor dengan `DispatcherSelector.fromConfig("nama-dispatcher")`. Prinsip umum: isolasi operasi blocking ke dispatcher khusus supaya tidak mengganggu throughput actor-actor non-blocking lainnya — ini praktik penting dalam sistem produksi Akka yang berinteraksi dengan resource eksternal lambat.

Contoh Konsep

// application.conf
// blocking-io-dispatcher {
//   type = Dispatcher
//   executor = "thread-pool-executor"
//   thread-pool-executor {
//     fixed-pool-size = 16
//   }
// }

import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
import akka.actor.typed.DispatcherSelector

object AksesFileBlocking {
  sealed trait Pesan
  case class BacaFile(path: String) extends Pesan

  def apply(): Behavior[Pesan] = Behaviors.receiveMessage {
    case BacaFile(path) =>
      // operasi blocking, sebaiknya dijalankan di dispatcher khusus
      println(s"Membaca file: $path")
      Behaviors.same
  }
}

object ContohDispatcher {
  def spawnDenganDispatcherKhusus(context: akka.actor.typed.scaladsl.ActorContext[_]) = {
    context.spawn(
      AksesFileBlocking(),
      "aksesfile",
      DispatcherSelector.fromConfig("blocking-io-dispatcher")
    )
  }
}

Praktikum

Lengkapi konfigurasi dispatcher khusus bernama db-blocking-dispatcher dengan fixed-pool-size 10, lalu gunakan DispatcherSelector.fromConfig saat men-spawn actor KoneksiDatabase.

Editor Latihan

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

Tips

Jangan sembarangan menaikkan fixed-pool-size dispatcher blocking terlalu besar — thread tetap resource mahal di JVM, jadi ukuran pool sebaiknya disesuaikan dengan karakteristik beban (misal jumlah koneksi maksimum yang didukung database eksternal).