Proyek Java sumber terbuka: Akka

Model aktor adalah paradigma penyampaian pesan yang menyelesaikan beberapa tantangan utama dalam penulisan kode yang serentak dan dapat diskalakan untuk sistem terdistribusi saat ini. Dalam angsuran proyek Java open source ini , Steven Haines memperkenalkan Akka, toolkit dan runtime berbasis JVM yang mengimplementasikan model aktor. Mulailah dengan program sederhana yang mendemonstrasikan bagaimana sistem penyampaian pesan Akka dihubungkan bersama, kemudian buat program yang lebih kompleks yang menggunakan proses bersamaan untuk menghitung bilangan prima.

Jika Anda memiliki pengalaman dengan pemrograman konkurensi tradisional, maka Anda mungkin menghargai model aktor, yang merupakan pola desain untuk menulis kode serentak dan skalabel yang berjalan pada sistem terdistribusi. Secara singkat, berikut cara kerja model aktor:

  1. Daripada meminta objek secara langsung, Anda membuat pesan dan mengirimkannya ke objek (disebut aktor ) melalui referensi aktor.
  2. Referensi aktor menyimpan pesan di kotak surat.
  3. Saat utas tersedia, mesin yang menjalankan aktor mengirimkan pesan itu ke objek tujuannya.
  4. Ketika aktor menyelesaikan tugasnya, ia mengirim pesan kembali ke objek asalnya, yang juga dianggap sebagai aktor.

Anda mungkin curiga bahwa model aktor lebih merupakan arsitektur yang digerakkan oleh peristiwa atau penyampaian pesan daripada solusi konkurensi yang ketat, dan Anda benar. Tapi Akka adalah cerita yang berbeda: implementasi model aktor yang memungkinkan pengembang untuk mencapai konkurensi tinggi yang mengesankan dengan overhead yang sangat rendah.

Unduh kode sumber untuk artikel ini. Dibuat oleh Steven Haines untuk JavaWorld.

Memikirkan ulang konkurensi dengan Akka (dan Scala)

Aktor memberikan abstraksi sederhana dan tingkat tinggi untuk konkurensi dan paralelisme. Mereka mendukung pemrograman berbasis peristiwa yang tidak sinkron, non-pemblokiran, dan berperforma tinggi, dan merupakan proses yang ringan. (Perusahaan pendiri Akka, Typesafe, mengklaim hingga 2,7 juta aktor per gigabyte RAM.) Akka dan kerangka kerja penyampaian pesan lainnya menawarkan solusi untuk tantangan pemrograman multithread (lihat bilah sisi "Apa yang salah dengan pemrograman multithread?"), Sementara juga memenuhi beberapa kebutuhan yang muncul dari pemrograman perusahaan:

  • Toleransi kesalahan : Hierarki supervisor mendukung semantik "let-it-crash" dan dapat berjalan di beberapa JVM dalam penerapan yang benar-benar toleran terhadap kesalahan. Akka sangat baik untuk sistem yang sangat toleran terhadap kesalahan yang sembuh sendiri dan tidak pernah berhenti memproses.
  • Transparansi lokasi : Akka dirancang untuk berjalan di lingkungan terdistribusi menggunakan strategi asynchronous penyaluran pesan murni.
  • Transactors : Gabungkan aktor dengan memori transaksi perangkat lunak (STM) untuk membentuk pelaku transaksional, yang memungkinkan aliran pesan atom dan fungsi coba ulang dan rollback otomatis.

Karena model aktor relatif baru bagi sebagian besar pengembang Java, saya akan menjelaskan cara kerjanya terlebih dahulu, kemudian kita akan melihat bagaimana penerapannya di Akka. Terakhir, kami akan mencoba perangkat Akka dalam program yang menghitung bilangan prima.

Apa yang salah dengan pemrograman multithread?

Pemrograman multithread pada dasarnya berarti menjalankan banyak salinan kode aplikasi Anda di utasnya sendiri dan kemudian menyinkronkan akses ke objek bersama. Meskipun ini merupakan masalah yang kompleks, pemrograman multithread memiliki tiga jalur kesalahan utama:

  • Objek bersama : Setiap kali beberapa utas mengakses objek bersama, selalu ada bahaya bahwa satu utas akan mengubah data tempat utas lain beroperasi di bawahnya. Biasanya, pengembang memecahkan masalah ini dengan merangkum fungsionalitas dependen dalam metode tersinkronisasi atau blok kode tersinkronisasi. Banyak utas mungkin mencoba memasuki blok kode itu, tetapi hanya satu utas yang akan berhasil; yang lain akan menunggu sampai selesai. Pendekatan ini melindungi data Anda, tetapi juga membuat titik di kode Anda tempat operasi terjadi secara serial.
  • Deadlock : Karena kita perlu menyinkronkan akses ke kode yang beroperasi pada resource bersama, terkadang terjadi deadlock. Dalam sinkronisasi kode (seperti dijelaskan di atas), utas pertama yang memasuki blok tersinkronisasi mendapatkan kunci, yang dimiliki oleh objek tempat operasi disinkronkan. Sampai kunci itu dilepaskan, tidak ada utas lain yang diizinkan untuk memasuki blok kode itu. Jika utas 1 memperoleh kunci ke blok tersinkronisasi 1, dan utas 2 memperoleh kunci ke blok tersinkronisasi 2, tetapi kebetulan utas 1 membutuhkan akses ke blok tersinkronisasi 2 dan utas 2 memerlukan akses ke blok tersinkronisasi 1 maka kedua utas tidak akan pernah selesai dan dikatakan menemui jalan buntu .
  • Skalabilitas : Mengelola banyak utas dalam satu JVM cukup menantang, tetapi ketika Anda perlu menskalakan aplikasi di beberapa JVM, masalahnya meningkat dengan urutan besarnya. Biasanya, menjalankan kode bersamaan di beberapa JVM melibatkan penyimpanan status bersama dalam database dan kemudian mengandalkan database untuk mengelola akses bersamaan ke data tersebut.

Akka dan model aktor

Akka adalah toolkit dan runtime open source yang berjalan di JVM. Ini ditulis dalam Scala (bahasa yang sering disebut-sebut sebagai konkurensi) tetapi Anda dapat menggunakan kode Java (atau Scala) untuk memanggil semua pustaka dan fiturnya.

Pola desain utama yang diterapkan Akka adalah model aktor, seperti yang ditunjukkan pada Gambar 1.