Februari 08, 2016

Supervisor Dengan Multiple Workers pada Elixir

Beberapa hari ini saya mencoba otak atik Elixir setelah sekian lama mengamati. Untuk yang sudah terbiasa dengan Erlang, barangkali menyesuaikan diri tidak akan terlalu sulit, sementara bagi yang belum pernah mengenal Erlang, konsep let it crash dari Erlang untuk fault tolerant systems perlu proses pembelajaran yang lumayan.

Konsep supervisor tree untuk proses di Elixir tidak ada hubungannya dengan proses di sistem operasi. Persamaannya hanya pada struktur tree. Pada proses di sistem operasi, tidak ada mekanisme untuk mengelola proses-proses tersebut, sedangkan pada Elixir, proses-proses tersebut dikelola menggunakan proses supervisi: ada proses untuk me-restart secara otomatis proses anak yang mati. Bagian ini mempunyai banyak pilihan, tetapi di tulisan ini saya hanya akan menampilkan mekanisme untuk membuat software menggunakan Elixir dengan banyak proses anak (sering disebut child process, sering juga disebut worker). Saya menulis ini karena tidak ada penjelasan yang jelas untuk materi ini. Pemula biasanya akan merasa kebingungan.

Program yang akan dibuat ini sebenarnya sederhana saja: membuat 3 worker process yang akan melakukan proses penambahan, pembagian, dan perkalian. Kode sumber bisa diperoleh di https://github.com/bpdp/elixir-playground. Pada dasarnya, hal-hal yang perlu diperhatikan pada repo tersebut adalah:
  1. Repo workers saya buat menggunakan mix new workers --sup karena sejak awal dimaksudkan untuk membangun aplikasi menggunakan beberapa worker dengan supervisi.
  2. Tidak ada perubahan pada hasil mix new di atas kecuali pada file-file berikut ini:
    • lib/workers.ex => saya ubah hanya berisi satu callback function (start, sudah ketentuan dari Elixir bahwa callback function bernama start dengan 2 argumen). Di callback function ini saya definisikan beberapa worker yang saya letakkan di file lib/workers/worker1.ex - sampai worker3.ex. Sesuai ketentuan dari Elixir, penamaan file dan nama module harus sesuai: workers/worker1.ex => Workers.Worker1
    • Worker process saya letakkan pada workers/worker1.ex - worker3.ex. Setiap worker menggunakan GenServer yang mengharuskan adanya function start_link dan init.
Untuk menjalankan:

$ mix run
Elixir.Workers.Worker1 started
7
Elixir.Workers.Worker2 started
3.0
Elixir.Workers.Worker3 started
60
Silahkan melihat halaman-halaman manual untuk penjelasan lebih lanjut.




0 comments:

Poskan Komentar