Mengenal Pemrograman Konkurensi pada Bahasa Pemrograman Elixir
Tags: erlang, elixir, concurrentprogramming, beam
Published: 2020-05-08 15:40:09

Dalam membangun sebuah aplikasi yang di dalamnya ada aktivitas pemrograman, terkadang kita dihadapkan pada situasi dimana dibutuhkan performansi dalam menjalankan proses-proses di dalam kode yang ditulis.

Untuk mencapai performansi yang memuaskan, dibutuhkan penggunaan resource seperti CPU dan memory yang maksimal dengan dijembatani oleh fasilitas yang terdapat dalam bahasa pemrograman.

Tak berbeda juga dengan bahasa pemrograman lain, Elixir yang berjalan diatas Erlang Virtual Machine (BEAM) ini memiliki berbagai fitur untuk melakukan pemrograman konkurensi atau concurrent programming, sehingga proses-proses yang berjalan diatas BEAM ini dapat memaksimalkan kerja CPU dan memory melalui pemrograman pada bahasa Elixir.

Hal yang membedakan pemrograman lain dan Elixir dalam pemrograman konkurensinya, Elixir memiliki konsep konkurensi berbasiskan Aktor (Actor Based Concurrency). Hal ini diturunkan dari bahasa pendahulunya yaitu Erlang. Erlang sendiri dikembangkan oleh Erricsson dan banyak digunakan untuk aplikasi telekomuniksi di seluruh dunia.

Dalam konkurensi berbasiskan Aktor, ada 3 hal yang penting untuk dilibatkan dalam jalannya program. Pertama adalah Aktor yang melakukan sebuah pekerjaan (actor), kedua adalah pekerjaan itu sendiri (process), dan terakhir adalah pesan yang dipertukarkan antar Aktor (message passing).

Kenapa ilustrasi Aktor diatas sangat penting dijabarkan dalam sebuah konsep pemrograman konkurensi ? Karena pada kenyataanya di bahasa pemrograman lain umumnya banyak yang terjerumus pada kompleksitas implementasi pemrograman konkurensi ini, yang disebabkan saling tumpang tindih, dan terjadi konflik dalam pemanfaatan resource memory dan IO (Disk, Network). Yang kemudian akan mengakibatkan jalannya program diluar harapan bahkan terjadi crash pada program.

Dengan konsep Aktor ini, masing-masing Aktor tersebut memiliki resource komputasi CPU dan memory secara terpisah, tidak ada lagi saling tumpang tindih, dan terjadi konflik penggunaan resource memory dan IO. Sehingga semua Aktor akan berjalan secara bersamaan menjalankan proses yang hanya Aktor tersebut eksklusif mengetahuinya, dan hanya akan berkomunikasi melalui penukaran pesan, tanpa saling berbagi alamat memory sebagai sebab konflik resource yang telah dijelaskan sebelumnya.

Ketika sebuah aktor sudah dinyatakan “hidup” dan siap menerima pesan, maka Aktor tersebut akan memiliki PID (Process ID). PID tersebut adalah sebuah alamat kirim mengirim pesan (message passing) antar Aktor.

<figure>
{% gist https://gist.github.com/rizki96/42cc3877283dd5fc915fb5130a933488 %}
<figcaption>Ilustrasi sebuah agent yang berupa Aktor, dimana memiliki alamat PID, kemudian dikirimkan pesan “update” dan “get”, yang pada akhirnya diperintahkan untuk “stop”</figcaption>
</figure>

Dan apabila sebuah Aktor, katakan Aktor A menginginkan Aktor lain untuk melakukan perhitungan, misalnya Aktor B, maka yang diperlukan hanya pengiriman pesan (message passing) dari Aktor A ke PID Aktor B yang menjalankan proses perhitungan tersebut.

Setiap pesan yang dikirim akan diterima oleh Aktor tadi di dalam sebuah Mailbox. Mailbox ini berupa antrian pesan, jika satu pesan berisi perintah untuk menjalankan proses perhitungan dan proses telah berhasil dijalankan maka akan diambil pesan berikutnya pada Mailbox, untuk kemudian dijalankan isi perintah dalam pesan tersebut, begitu seterusnya.
<figure>
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/34tk9g8vw7e1un4u4t2q.jpg)<figcaption>Ilustrasi Aktor yang saling mengirimkan pesan, dalam masing-masing Aktor tersebut memiliki resource CPU dan memory secara terpisah, dan menjalankan proses secara eksklusif</figcaption>
</figure><figure>
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/dl42qx87n9hqoxuxfkvc.jpg)<figcaption>
Ilustrasi Aktor, PID, Pesan dan Mailbox (diambil dari https://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency)
</figcaption>
</figure>

Aktor A yang sebelumnya mengirimkan pesan, memiliki 2 pilihan, yaitu menunggu hasil proses perhitungan, sehingga nilai dari perhitungan tadi dapat digunakan oleh Aktor A, atau mengabaikan semua hasil perhitungan, dan membiarkan Aktor B yang mengurus semua hasil perhitungan (misalnya dengan disimpan ke database atau lainnya).

Pada suatu aplikasi yang menjalankan BEAM ini, memiliki ribuan, ratusan ribu bahkan jutaan Aktor adalah hal yang biasa. Sehingga aplikasi seperti Whatsapp yang dibangun diatas BEAM dengan bahasa Erlang dapat melayani miliaran pesan dalam suatu waktu.

Keuntungan lain dari Aktor ini adalah skalabilitas di level jaringan, dimana antar Aktor ini bisa saling berkomunikasi tidak hanya di level satu aplikasi, tapi juga bisa saling berkomunikasi atau berkirim pesan antar mesin di dalam suatu jaringan. Dari sisi kode yang dibangun, keuntungan yang didapatkan adalah pengembang akan fokus terhadap logika aplikasi yang dibangun, tanpa ada gangguan dari kode-kode yang berhubungan dengan saling tumpang tindih resource dan kode-kode untuk menghindari konflik resource memory dan IO.

Sisi negatif dari Aktor ini adalah penggunaan memory yang relatif lebih besar dibandingkan solusi konkurensi pada bahasa pemrograman lainnya. Dan untuk mendapatkan performansi kecepatan secara kasar (yang tidak menggunakan proteksi di memory) aplikasi Elixir sulit untuk dicapai, dimana BEAM telah memproteksi semua jalannya Aktor agar stabil dalam penggunaan memory, sehingga memiliki trade off atau harga yang dibayar dengan kecepatan dan besarnya memory untuk kestabilan sistem aplikasi.

Demikian sekilas konsep konkurensi berbasis Aktor pada bahasa pemrograman Elixir, untuk sumber pengetahuan lebih lanjut mengenai bahasa pemrograman Elixir, silahkan kunjungi https://elixirschool.com/id/