Microservices

Microservices, Konsep dan Implementasi (2)

1024 536 Dian Boyke

Dari tulisan saya sebelumnya disini, kita sudah membahas konsep microservices dan mencoba memahami bagaimana arsitektur aplikasi dapat mempengaruhi performa dan kemampuan skalabilitas yang tinggi.

Sebelumnya mari kita coba bandingkan proses implementasi pada arsitektur aplikasi yang bersifat monolitik dan bagaimana mereka melakukan scaling dengan pendekatan subdomain.

Monolithic

Arsitektur aplikasi monolitik ini lebih sederhana dalam implementasinya. Kita bisa mulai dengan membuat cluster server yang identik kemudian menggunakan konfigurasi system dan aplikasi yang sama antara satu server dengan yang lain. Dan pastikan data (database, cache, session dan files) di simpan diluar cluster aplikasi agar aplikasi dapat berjalan sama di antara semua cluster server.

Kemudian kita ingin membagi load server dengan memisahkan aplikasi backend dan frontend. Kita akan pisahkan dengan menggunakan subdomain yang berbeda. Disini kita menggunakan domain ‘example.com’ sebagai contoh, maka kita setup subdomain www.example.com sebagai frontend dan subdomain admin.example.com sebagai backend.

Dengan menggunakan subdomain yang berbeda ini kita dapat mengarahkan IP nya ke server yang sama (VirtualHost yang beda), atau menggunakan IP yang berbeda. Karena tujuan kita untuk membagi load antar server, maka pilihan menggunakan IP yang berbeda adalah solusi yang tepat.

Sekarang kita punya IP yang berbeda untuk subdomain www.example.com dengan admin.example.com, dan kita bisa pisahkan cluster web diantara kedua aplikasi tersebut. Dan proses diatara kedua cluster tersebut tidak akan saling mempengaruhi secara langsung.

Dengan memiliki cluster yang berbeda akan lebih memudahkan kita untuk me-manage, monitoring dan membuat perencanaan scaling infrastruktur. Kita ambil contoh yang real seperti ini, andaikan akan ada promosi besar di website dan di perkirakan traffic akan melonjak drastis, maka scaling akan lebih efektif karena cukup dilakukan pada frontend saja.

Microservices

Seperti yang sudah kita ketahui bahwa arsitektur microservices ini memecah aplikasi menjadi service-service kecil. Dengan tujuan agar setiap service tersebut bekerja secara optimal, dengan mempertimbangkan teknologi yang sesuai dengan kebutuhannya.

Aplikasi dipecah tidak sekedar hanya memisahkan antara backend dan frontend, melainkan dipecah menjadi service-service yang berfungsi secara spesifik. Apabila kita menjalankan layanan website blog, maka dengan pendekatan microservices aplikasi bisa di breakdown menjadi layanan khusus konten, statistik, ad, reporting, photo/video, messaging, searching, komentar dan lainnya.

Tetap pada saat kita memecah aplikasi menjadi layanan-layanan yang kecil, kita akan dihadapkan pada cluster aplikasi dengan stack teknologi yang beragam dengan jumlah yang banyak. Mungkin di bagian konten kita menggunakan PHP dan Mysql, tetapi di fitur statistik kita menggunakan stack teknologi seperti Python, Memcached dan Mongodb, dan begitu juga dengan layanan lainnya dengan teknologi yang di adopsinya.

Sebelumnya kita dengan mudah menggunakan subdomain untuk memisahkan antar aplikasi, tetapi apabila menggunakan teknik yang sama untuk microservices ini, maka yang akan terjadi adalah aplikasi akan terlihat fragmented karena menggunakan subdomain yang terlalu banyak.

Ada beberapa kekurangan dari penggunaan subdomain ini, yang pertama adalah aplikasi akan sulit untuk dimaintain, terutama untuk interkoneksi internal dari aplikasi. Misalnya untuk frontend kita menggunakan https://www.example.com, kemudian ada https://stat.example.com/view/5 untuk statistik, dan reporting menggunakan https://report.example.com/2016/12/05 dan sebagainya.

Selain masalah administrasi aplikasi yang terlalu rumit, dari sisi digital marketing pun dinilai tidak SEO-friendly karena menggunakan Subdomain yang terlalu banyak. Begitu pula dari user experience, sewaktu user membuka website akan menjadi lebih lama, karena setiap subdomain yang diakses akan membutuhkan waktu untuk resolving ke server DNS.

Yang perlu kita lakukan adalah membuat kumpulan layanan tersebut menjadi satu kesatuan secara logic. Dalam sebuah aplikasi web kita akan membuatnya lebih sederhana dengan hanya menggunakan satu subdomain saja (www.example.com). Sehingga semua entitas yang berinteraksi dengan aplikasi (user, aplikasi internal dan eksternal, crawler, cron) akan melihatnya seperti sebuah arsitektur aplikasi monolitik yang sederhana.

Apabila kita masih menggunakan contoh yang diatas, maka aplikasi frontend tetap dapat diakses melalui https://www.example.com, statistik dengan alamat https://www.example.com/stat/view/5, dan reporting menggunakan alamat https://www.example.com/report/2016/12/05, atau gallery diakses dengan alamat http://www.example.com/gallery.php. Dari sini terlihat semua layanan walaupun menggunakan stack teknologi yang berbeda-beda, tetapi tetap diakses melalui subdomain/domain yang sama.

Load Balancer Layer 7

Kita dapat menggunakan Load balancer yang mendukung balancing di layer 7 untuk melakukan tugas ini. Di layer 7 ini load balancer tidak hanya akan membagi traffic saja tetapi dia mampu membaca isi paket (terutama HTTP/S) agar dapat membagi load berdasarkan pola URL.

Untuk implementasi microservices yang baik paling tidak kita harus menggunakan dua layer dari load balancer. Yang pertama berfungsi membagi traffic berdasarkan URL, dan yang kedua berguna untuk membagi traffic berdasarkan load server. Apabila digambarkan maka implementasi microservices akan memiliki desain infrastrukturnya akan seperti gambar dibawah ini

Dengan arsitektur yang seperti ini akan memudahkan tim infrastruktur untuk melakukan scaling. Selain mudah, proses scaling akan lebih efektif karena scaling hanya dilakukan pada cluster yang membutuhkannya saja. Salah satu kelebihan lainnya yakni dari sisi security lebih baik karena semua teknologi dan arsitektur dibelakangnya tidak akan terekspos dari dunia luar.

Kesimpulan

Migrasi arsitektur aplikasi dari monolithic ke microservices mungkin akan menambah pekerjaan untuk developer dan system architect. Tetapi hasil yang didapat akan mempengaruhi proses kerja dan hasilnya akan terasa untuk jangka panjang. Sekilas mungkin arsitektur ini akan terlihat lebih rumit, tetapi arsitektur yang seperti inilah yang seharusnya dijadikan standar dalam merancang aplikasi yang besar. Pada saat kita sudah terbiasa dengan arsitektur ini, selanjutnya kita akan lebih fokus pada fungsi-fungsi yang spesifik.

Walaupun kita menyebutnya sebagai arsitektur aplikasi, tetapi pada praktiknya akan melibatkan tim infrastruktur dalam mengimplementasikannya. Tools seperti load balancer menjadi kunci untuk menjadikan microservices menjadi terlihat lebih terintegrasi. Tetapi dibalik kesederhanaanya itu, cluster web akan menjadi lebih mudah di maintain dan proses-proses yang terjadi akan berjalan pada cluster yang independent

5 comments
  • topanbegin

    Halo mas Boyke,

    artikel yang bermanfaat sekali dan inspiratif, untuk load balancer layer 7 biasanya menggunakan tools apa ya yg powerful ?

    terima kasi sebelumnya atas jawabannya.

    • Boyke

      Hi Mas Topan,

      Load balancer umumnya udah support L7 semua. Untuk hardware yg powerful LTM-F5 (karena pernah pakai 😀 ). Untuk software yang banyak dipakai Nginx dan HaProxy, Tp secara personal saya lebih milih Nginx mas 🙂

      Minggu ini akan saya akan coba bahas secara teknis penggunaannya 🙂

  • Chandra Kurniawan

    Halo mas Boyke,

    Saya sedang mencoba menerapkan microservices di startup tempat saya bekerja. Lalu ketemu artikel ini dimana part 1 dan 2 sangat membantu saya memahami konsep microservices.

    Yang mau saya tanyakan adalah, apakah memungkinkan menerapkan microservices pada server cloud, semisal AWS, klo ga salah cloud sudah punya load balance sendiri. Lalu yg dimaksud tidak menggunakan subdomain itu maksudnya setiap aplikasi hanya dipisahkan menggunakan folder-folder di satu root?

    Rencananya saya menggunakan Django utk API Centric, Laravel utk backend, Angular untuk frontend, nodejs untuk chat. Kira2 ideal ga ya?

    Terima kasih sebelumnya atas saran dan jawabannya.

    • Boyke Dian Triwahyudhi

      Hi Mas Chandra,

      Thanks utk responsnya. pada dasarnya sih Microservices merupakan arsitekturisasi di level aplikasi, tanpa melihat infrastruktur yang digunakannya, bisa local datacenter, docker, private/public cloud, bahkan di single server. jadi sangat dimungkinkan utk diterapkan di AWS, apalagi mereka punya service API Hub dan ELB yang sudah support L7 balancing 🙂

      Untuk pendekatan non-subdomain, dapat dilakukan dengan cara routing di aplikasi atau cara yang sederhana yakni menggunakan folder2. yang perlu di catat disini adalah, letak doc_root dan server dapat di dipisah di cluster/server berbeda. kunci nya adalah bagaimana melakukan routing yang benar di level load balancer (berdasarkan port, url pattern, methods, dll).

      Application stack yang mas Chandra gunakan sudah ok banget, hanya pastikan untuk gunakan programming language/framework/module yang sesuai dengan kebutuhan atau fungsi microservices yang spesifik.

      Silahkan reply kalo masih ada yg bingung ya..

      Semoga membantu 🙂

      Boyke

Leave a Reply to Boyke Dian Triwahyudhi Cancel Reply

Your email address will not be published.