Pendahuluan

Apa itu serverless, bisa dilihat di sini

Desain aplikasi makin hari makin menuju ke serverless, artinya hampir tidak peduli lagi dengan dimana lokasi server, berapa memory nya, berapa jumlah server, alamat IP nya apa, dll..

Semuanya diserahkan ke framework yang sudah ada untuk mengatur alokasi server, cpu, memori dan storagenya.

Dan makin lama, makin canggih lagi, dengan tidak peduli lagi pakai code apa, logicnya seperti apa, yang penting datanya bisa didapatkan melalui service/fungsi.

Ini yang kita temui di aplikasi-aplikasi baru, di perusahaan rintisan, atau perusahaan dengan tingkat digitalisasi yang tinggi.

Atau juga di perusahaan dengan semangat Agile dalam deliver value ke basis customer mereka.


Perlukan desain aplikasi serverless ini ?

Tentu saja perlu. Apa saja yang baik tentu saja harus didesain dengan baik juga.

Mengutip dari blognya AWS di sini, untuk mendesain aplikasi yang serverless diperlukan :

  • Decoupling/Pemisahan komponen.
  • Menjadikan komponen stateless dan asynchronous.
  • Menggunakan sedikit code saja untuk tiap komponen.

Kenapa ini perlu ?

Karakteristik aplikasi-aplikasi perusahaan rintisan, atau berbasis customer dan digital, biasanya akan berkembang sesuai keterkenalan aplikasi di masyarakat.

Seiring dengan bertambahnya pengguna, proses, dan juga fitur, maka yang menjadi permasalahan terbesar nantinya adalah :

  • Menjaga kesederhanaan desain aplikasi, karena kalau desainnya tidak sederhana, dengan begitu banyak pengguna, proses, dan juga fitur, maka tamat lah riwayat Anda dalam maintain aplikasi. Hidup akan dihabiskan untuk melihat kompleksitas dari proses, fitur dari aplikasi. Perubahan kecil saja mungkin bisa membuat analisa rumit dalam aplikasi.

  • Menjaga agar low-code implementation. Artinya dengan kata lain sistem kita mudah dikonfigurasi tanpa mesti masuk ke level coding. Hal ini penting karena dengan penambahan pengguna, proses, dan fitur, maka kompleksitas akan bertambah. Kompleksitas seperti itu tidak akan mampu lagi dikelola dengan melakukan coding secara hardcode (hmm, bisa sih bro, tapi akan sangat painfull). Menanganinya akan lebih mudah dengan menggunakan konfigurasi.

Jadi, kita ikutan setuju ya kalau perlu desain untuk aplikasi serverless ..

Yaa, setujuu..!!


Lalu bagaimana desain aplikasi serverless yang baik itu ?

Oke, seperti yang ditulis di awal artikel ini, coba kita lihat satu persatu :


  1. Decoupling/Pemisahan komponen.

Pemisahan komponen ini misalnya dari aplikasi yang bersifat Monolithic menjadi Microservices.

Hal ini juga misalnya berakibat kepada pemisahan repository code. Code yang dulunya dalam satu repository besar, dipecah menjadi kelompok-kelompok service dalam microservice yang sesuai. Masing-masing microservice mempunyai code repository terpisah.

Hal ini memudahkan dalam mengatur komponen serverless yang akan kita pakai dan independensi tim yang melakukan development.

Misalkan kalau dulu pakai Monolithic, kita mengumpulkan beberapa fungsi dalam satu code AWS Lambda, yang mana nanti akan mempunyai potensi konflik ketika 2 fungsi berbeda di code tersebut diubah oleh 2 orang/tim yang berbeda.

Dengan pemisahan komponen ini, maka fungsi-fungsi berbeda dalam satu code AWS Lambda, bisa dipecah lagi untuk masing-masing fungsi. Akibatnya 2 orang/tim yang mengerjakan fungsi yang berbeda bisa lebih independen dalam development dan deployment nantinya.

Begitu juga misalnya kita lihat misalnya dengan menerapkan di level lebih dalam lagi, seperti pattern CQRS (Comman Query Responsibility Segregation), dimana dilakukan pemisahan antara proses melakukan update informasi dengan proses membaca informasi.

Pemisahan di CQRS ini didasari karena beban load, proses dan jumlah informasi yang dibutuhkan antara membaca informasi dengan update informasi berbeda.

Pemisahan komponen misalnya di CQRS ini juga memungkinkan kemudahan dalam desain aplikasi serverless misalnya dengan memakai AWS DynamoDB untuk update informasi, dan kemudian menggunakan AWS Aurora ketika melakukan membaca informasi dari banyak sumber data.


  1. Menjadikan komponen stateless dan asynchronous

Stateless artinya komponen kita tidak mengetahui status terakhir dari dirinya sendiri, sehingga dengan mudahnya kita bisa restart, perbanyak / scaling komponen tersebut, tanpa takut akan terjadi konflik dengan identity, status, atau hal lainnya.

Asynchronous artinya sebuah pemrosesan yang dapat dilakukan dengan mengesampingkan waktu/lamanya response. Contohnya email, sms, asynchronous messaging yang misalnya sebuah email kita kirim sekarang, bisa sampai di penerima besok hari, dll.

Begitupun hal diatas dapat diakomodasi dengan menerapkan event-driven architecture, yang memudahkan dari sisi integrasi sistem yang mulai rumit.

Dengan komponen yang stateless dan asynchoronous, maka aplikasi kita akan lebih mampu untuk memproses request yang banyak, dan juga mengatur tingkat kecepatan pemrosesan secara otomatis.

Dengan komponen yang stateless dan asynchoronous ini, maka kita bisa dengan mudah menggandakan service kita / auto scaling ketika ada perubahan jumlah request menjadi banyak.

Hal ini memudahkan dalam desain aplikasi yang menggunakan komponen serverless yang ada di cloud.


  1. Menggunakan sedikit code saja untuk tiap komponen.

Hal ini menyangkut low-code implementation.

Artinya sebisa mungkin kita fokus kepada fungsi, proses, atau alur bisnis/teknis dari fitur yang akan kita buat.

Hal-hal yang bersifat repetitif dan teknis yang mungkin menghabiskan waktu kita bisa diminimalisir waktu kita menyentuh level coding. Misalnya konfigurasi koneksi database, otentikasi, identity, alur proses, sistem orkestrasi proses, CI/CD deployment, dll.

Hal ini biasanya bisa kita dapatkan dengan cara :

  • memakai platform low-code implementation yang sudah ada.
  • membuat framework sendiri yang memungkinkan low-code implementation seperti untuk CI/CD job deployment, proses orchestration, dll.
  • menggunakan service-service serverless yang tersedia di cloud.

Contohnya ada di fungsi serverless di cloud juga, misalnya AWS CodePipeline yang berguna untuk low-code implementation dari CI/CD.

Atau AWS Step Function yang bisa jadi orkestrasi dari proses bisnis/teknis yang ada di fitur/aplikasi kita.

Atau menggunakan platform yang sudah ada untuk otentikasi dan otorisasi seperti Okta, AWS Cognito, atau OAuth2 vendor lainnya

Kesimpulan

Aplikasi di zaman sekarang sudah mengarah kepada aplikasi serverless.

Semuanya diserahkan ke framework yang sudah ada untuk mengatur baik cpu, memori, proses, network, alur, dll.

Kebutuhan itu biasanya muncul di aplikasi-aplikasi perusahaan rintisan, atau berbasis customer dan digital.

Hal ini karena kebutuhan agar cepat, lincah, perubahan alur dan integrasi dengan sistem lain.

Untuk aplikasi ini bisa tetap survive di perubahan yang cepat ini, maka perlu dibikin desain dari aplikasi menjadi lebih serverless.

Desainnya mesti hati-hati dan sebaiknya dilakukan dengan konsep sbb :

  • Decoupling/Pemisahan komponen.
  • Menjadikan komponen stateless dan asynchronous.
  • Menggunakan sedikit code saja untuk tiap komponen.