Membuat Servis Aplikasi (Go Based) Kita Immortal

Arief Darmawan
KANO Engineering
Published in
4 min readNov 12, 2018

Dalam dunia fiksi, immortal adalah sebutan untuk mereka yang ndak bisa mati, dibacok lah, dibom lah, di-nuke sekalian, ehhh dia masih bisa bertahan hidup. Tokoh seperti Wolverine, Deadpool, dan semua komunitas Highlander adalah representasi dari immortal being yang ndak bisa mati … kecuali dengan peraturan tertentu. Menjadi immortal bagi para superhero itu ada pro dan kontranya. Tapi bagi sebuah aplikasi, menjadi immortal lebih banyak pro-nya.

Reliability / kehandalan adalah salah satu kunci utama untuk menyatakan sebuah servis layak berada di fase produksi atau tidak. Dan tolak ukur dari reliability ini adalah downtime atau lama waktu servis kita tidak menyala pada kurun waktu tertentu.

Downtime sendiri sebenarnya terbagi menjadi dua macam downtime. Expected downtime, adalah downtime yang memang kita harapkan, downtime ini terjadi karena memang kita sengaja mematikan servis untuk keperluan tertentu, misal: upgrade binary, merubah konfigurasi dan memerlukan restart servis, dan sejenisnya. Unexpected downtime, adalah jenis downtime kedua yang akan menjadi mimpi buruk para DevOps dan Sysadmin karena downtime ini adalah downtime yang tidak diharapkan. Downtime ini umumnya terjadi karena hal-hal yang pelik yang ujung pangkalnya mungkin memerlukan penelitian lebih dalam.

Pada kesempatan kali ini, kita akan coba membuat sebuah konsep immortal application dengan menggunakan bahasa pemrograman Go

Use case — sebuah aplikasi yang error-potential-free

Well, jujur sih ndak akan ada aplikasi yang error-potential-free, karena biarpun sebagus apapun coding kita, banyak hal-hal lain diluaran sana yang akan berpengaruh ke reliability aplikasi kita. Jaringan tiba2 mati lah, database kehabisan storage lha, dan lain-lain.

Go sendiri sebagai bahasa, cukup bijak dengan membuat error sebagai sebuah object dan membuat guideline untuk mengembalikan nilai error ini pada fungsi-fungsi yang kita yakini berpotensi memiliki error

Coba lihat kode ini

Kode di atas adalah simple code yang akan terus menangkap value dari standard input untuk kemudian dilakukan banyak pengecekan apakah value tersebut adalah integer. Apabila iya, kuadrat value dari nilai tersebut akan disebutkan. Dan apabila ada kesalahan, sekian banyak error handling akan menangani error tersebut

Base case, sebuah aplikasi yang error-potency-free

So far, so good … tapi real life challenge tidak seindah dan semudah tutorial di internet. Seperti diatas, banyak hal yang bisa menyebabkan panic error dikirim oleh aplikasi kita dan berujung pada tewasnya aplikasi kita … an unexpected shutdown

Unexpected Shutdown

Coba kita tambahkan sedikit baris pada code kita diatas, untuk mensimulasikan panic shutdown

Pada line 27–29 di atas, kita tambahkan beberapa line yang akan mengembalikan panic error apabila nilai yang dimasukan adalah antara 10 50. Well, tentu saja kita dengan mudah bisa membuat error trap disini, tapi misalkan ini adalah panic error yang akan dimunculkan oleh banyak hal yang mungkin tidak kita antisipasi sebelumnya, and trust me, banyak banget hal-hal kecil yang memungkinkan ini terjadi: interface{} handling, array index, object yang belum dicreate di sebuah fungsi, jaringan yang tiba-tiba koit, database lock, open file limit yang kekecilan dan aneka hal-hal lain. Jadi intinya panic error sangat mungkin terjadi

Panic error terjadi

Mengenali Panic Error

Panic error terjadi karena ada sebuah kesalahan yang terjadi dan bersumber dari proses yang tidak diantisipasi untuk menimbulkan kesalahan, sehingga tidak ada error trapping disana. Panic error secara otomatis akan memberhentikan semua thread, termasuk thread utama. Konsekuensinya aplikasi kita akan mengalami shutdown dan sebuah unexpected downtime terjadi

Di bahasa Go, ada perintah recover yang difungsikan untuk mengantisipasi panik, tapi perintah ini hanya difungsikan untuk mengidentifikasi apabila panic terjadi atau tidak, dan mengisolate akibat dari panic hanya pada thread yang bersangkutan.

Gotcha, we got a hint

Dengan memanfaatkan karakteristik recover kita bisa membuat karakteristik aplikasi kita menjadi immortal

Untuk membuat aplikasi kita bersifat immortal, pastikan tidak ada potensi error di main thread, dan letakan process utama di thread lain dan antisipasi panic di thread tersebut dengan perintah recover

Pada kode diatas, proses utama saya masukan sebagai go-routine baru sehingga proses tersebut akan dijalankan pada thread yang berbeda daripada main thread. Juga recover digunakan untuk mengantisipasi dan mengisolatepanic yang akan terjadi pada thread tersebut

Terus apa gunanya main thread dong? main thread bisa digunakan untuk:

  1. Melakukan persiapan sebelum proses utama dijalankan (pastikan error free)
  2. Melakukan monitoring terhadap proses utama
  3. Melayani proses expected shutdown, karena untuk beberapa hal, kita perlu memberhentikan aplikasi kita. Expected shutdown ini bisa dilihat pada kode diatas line 48, 51–48, dan 58–66
recover mengantisipasi panic di thread lain

Bisa dilihat, ketika panic terjadi, aplikasi tidak berhenti karena panic terjadi pada thread lain dan diisolasi oleh recover. Main thread tetap aman

Tapi heyyy, muncul persoalan lain, proses utama berhenti, jadi istilahnya aplikasi kita mati segan hidup tak mau, karena sekalipun tidak shutdown tapi proses utamanya tidak berjalan.

Untuk membuat aplikasi kita bersifat immortal, self start servis utama harus dilakukan ketika panic terjadi

Nah bagaimana melakukan proses self start ini. Sederhana saja, cukup buat sebuah wrapper yang berfungsi untuk melakukan: 1. Panic handling dengan recover, 2. Mengaktifkan proses utama

Secara sederhana kode wrapper ini adalah sebagai berikut

Oke, mari kita lihat hasilnya …

Sebuah aplikasi yang bersifat immortal

So, that’s it … how to make an immortal application or service using Go

Kode lengkapnya dibawah ini

Semoga bisa menambah khasanah pengetahuan dalam menciptakan solusi digital yang lebih berkualitas

Happy coding !!!

--

--

Arief Darmawan
KANO Engineering

Traveler (with family), food tester, horror and thriller movie enthusiast. Passion about programming, techno-preneur and giving back to society