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.
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).