Introduction
Dulu waktu masih fresh graduate, gue pernah dapet kesempatan interview di salah satu perusahaan video on demand yang cukup terkenal di Indonesia. Gue masih inget momen itu, saat itu dengan modal skill yang jujur aja masih junior banget. Yang bisa di bilang gue cuma tau "How to make the app" alias skill coding cuma mentok di sebatas CRUD aja. Untungnya gue pernah mengerjakan beberapa project freelance sewaktu kuliah jadi bisa di bilang modalnya lumayan buat hadapi interview.
Saat itu gue dihadapkan dengan user interview, awalnya pertanyaan yang dilontarkan pun masih seputar fundamental programming dan pengalaman pernah bikin aplikasi apa saja sebelumnya. Sampai akhirnya pertanyaan mengarah ke
"Mas gimana sih caranya biar app yang sudah ada di production gak down atau nggak lemot ketika sedang banyak penggunanya atau di akses secara bersamaan oleh banyak user?"
Saat itu yang terpikir oleh gue adalah, "oh kalau misal usernya mulai banyak mungkin opsi yang bisa kita lakukan yaitu dengan upgrade spek server nya, bisa dari sisi RAM nya atau CPU nya mas."
Jawaban itu pun keluar dari mulut gue, si interviewer pun kurang puas dengan jawaban gue, dia menambahkan
"Oh itu namanya scalability secara vertikal ya mas tapi gimana kalau server nya sudah mentok, mau di naikin lagi? Selain itu bukannya upgrade spek server itu cost nya lumayan mahal ya mas dan performa juga akan tetap terbatas?"
Disitu gue mulai coba cari jawaban lain, dengan spontan gue menjawab "hmm mungkin kita bisa coba optimize dari sisi query database mas contohnya saat ada query SELECT kita coba jangan get all column tapi spesifik columns yang kita butuhkan saja, dan kita bisa pakai cache juga untuk data yang yang sering diakses dan perubahan nya jarang mas dengan Redis dan selain 2 cara tadi mungkin kita juga bisa membuang variable atau function yang gak kepake mas untuk mengurangi penggunaan resource server mas"
Awalnya gue pede dengan jawaban itu sampai akrhinya si interviewer ini membalas "oke itu beberapa hal yang bisa kita lakukan tapi itu masih di level application layer mas, selain itu ada lagi mas?"
"Hmm saya cuma kepikiran dengan cara itu mas" jawab gue pasrah
Dan ya dari hasil interview itu gue gagal untuk mendapatkan pekerjaan tersebut. Walaupun gagal mendapatkan pekerjaan itu, gue mendapatkan banyak pelajaran berharga dari interview tersebut, karena dari moment itu gue mulai cari tau tentang Scalability system
Jadi Scalability System itu apa sih?
Scalability adalah kemampuan sebuah sistem untuk menangani peningkatan beban kerja atau permintaan tanpa mengalami penurunan performa yang signifikan.
Untuk lebih mudah memahami tentang scalability, mari kita bayangkan seperti ini.
Misalkan gue punya warkop di depan rumah, dan gue kerjain sendirian, mulai dari masak, layanin pelanggan, sampai cuci piring. Warkop ini paling banyak bisa nampung 10 pelanggan sekaligus. Lebih dari itu, pelayanan mulai lemot dan ada yang cancel karena kelamaan nunggu. Untungnya rata-rata pelanggan gue emang cuma sekitar 10 orang, jadi kapasitas warkop masih pas sama demand yang ada.
Sampai suatu hari warkop gue viral di media sosial. Dalam semalam, pelanggan yang dateng jadi 100 orang.
Dan dari situ mana mungkin gue layanin 100 orang sendirian, akhirnya banyak pesanan yang harus gue cancel padahal mereka udah ngantri lama. Solusinya cuma satu: buka cabang baru dan rekrut karyawan buat bantu masak, layanin pelanggan, sama cuci piring. Dengan begitu, gue bisa nampung lebih banyak pelanggan tanpa ngorbanin kualitas layanan.
Dan analogi yang sama ketika kita menghadapi beban kerja atau permintaan yang besar pada sebuah sistem (apps/website/backend service).
Misalkan ada sebuah website ecomerce disitu terdapat fitur checkout barang, nah pada saat promo berlangsung misal Harbolnas, website tersebut bisa menerima hingga puluhan ribu requests dalam 1 detik. Dan jika website tersebut tidak mampu menangani permintaan tersebut, maka bisa menyebabkan website tersebut mengalami down atau lemot.
Karena dari itu penting banget buat serorang software engineer untuk memahami tentang scalability, agar dapat merancang sistem yang dapat menangani peningkatan beban kerja atau permintaan tanpa mengalami penurunan performa yang signifikan.
Secara umum scalability dibagi menjadi 2, yaitu :

1. Vertical Scalability (Scale Up)
Vertical scalability, atau sering disebut scale up, adalah pendekatan untuk meningkatkan performa sistem dengan cara meningkatkan sumber daya pada satu server yang sudah ada. Ini seperti kalau di warkop tadi, gue memutuskan untuk menambah kapasitas kompor, stok bahan baku, dan mungkin beli mesin cuci piring yang lebih besar. Gue tetap kerja sendiri, tapi dengan alat yang lebih mumpuni, gue bisa melayani lebih banyak pelanggan.
Dalam konteks Software Engineering, vertical scalability berarti menambah kapasitas server yang sudah ada, misalnya dengan menambah RAM, CPU, atau ruang penyimpanan. hal yang gue jelaskan saat di sesi interview pertama kali. Namun, pendekatan ini memiliki beberapa kelemahan :
- Ada Batasan Fisik : Ada batas fisik seberapa besar satu server bisa ditingkatkan kapasitasnya. Jika sudah mencapai batas maksimal, mau tidak mau kita harus menambah server baru atau beralih ke horizontal scalability.
- Biaya Mahal : Biaya untuk meningkatkan sumber daya server juga akan semakin mahal seiring dengan peningkatan kapasitas. apalagi kalau kita pakai cloud server seperti AWS atau Azure mau nggak mau kita harus upgrade ke tier yang lebih tinggi yang biayanya lumayan signifikan.
- Single Point of Failure : Jika server tersebut mengalami kegagalan, seluruh sistem akan terpengaruh. Ibaratnya kalau satu-satunya orang yang bisa masak di warkop gue sakit, maka warkop gue tutup dan tidak ada pelanggan yang bisa di layani
2. Horizontal Scalability (Scale Out)
Horisontal scalability, atau sering disebut scale out, adalah pendekatan untuk meningkatkan performa sistem dengan cara menambah jumlah server. Ini seperti kalau di warkop tadi, gue memutuskan untuk membuka cabang baru dan merekrut karyawan untuk bantu masak, layanin pelanggan, sama cuci piring. Dengan begitu, gue bisa nampung lebih banyak pelanggan tanpa ngorbanin kualitas layanan.
Dalam konteks Software Engineering, horizontal scalability berarti menambah jumlah server untuk menangani peningkatan beban kerja atau permintaan. Hal ini bisa dilakukan dengan menambah server baru, atau memecah aplikasi menjadi beberapa microservices yang berjalan di server terpisah. Kelebihan horizontal scalability adalah :
- Tidak Ada Batasan Fisik : Tidak ada batasan fisik seberapa besar sistem bisa ditingkatkan kapasitasnya. Kita bisa terus menambah server sesuai dengan kebutuhan.
- Biaya Lebih Murah : Biaya untuk menambah server juga akan semakin murah seiring dengan peningkatan kapasitas. Kita bisa pakai server yang lebih kecil daripada harus upgrade ke server yang lebih besar.
- Tidak Ada Single Point of Failure : Jika satu server mengalami kegagalan, sistem akan tetap berjalan karena ada server lain yang bisa menggantikan. Beda dengan vertical scalability, di mana kalau satu-satunya server itu down, seluruh sistem ikut down. Ibaratnya kalau gue punya 2 cabang warkop dan salah satu cabang tutup karena karyawannya sakit, cabang lainnya masih bisa tetap melayani pelanggan.
Horizontal Scalability: Bagaimana Cara Kerjanya?
Untuk mencapai horizontal scalability, ada beberapa konsep penting yang perlu dipahami, yaitu load balancing, server horizontal, dan database sharding.
1. Load Balancing
Load balancing adalah proses mendistribusikan beban kerja atau permintaan ke beberapa server. Balik lagi ke warkop tadi, sekarang gue udah punya beberapa cabang dan karyawan yang bantu masak, layanin pelanggan, sama cuci piring. Tapi masalah baru muncul gimana caranya agar pelanggan yang dateng gak numpuk semua ke satu cabang doang, sementara cabang lain sepi? Di situlah load balancing berperan.

Ibaratnya load balancer itu kayak tukang parkir di depan warkop gue, dia yang ngatur mobil biar gak numpuk di satu titik dan semua kebagian tempat. Begitu juga load balancer, dia yang ngatur requests yang masuk biar tersebar rata ke semua server, gak numpuk di satu server doang. Selain itu, load balancer juga bisa ngecek server mana yang lagi sibuk atau lagi bermasalah, jadi dia bisa ngarahin request ke server yang sehat dan gak lagi kewalahan.
2. Server Horizontal
Server horizontal adalah server yang ditambahkan untuk meningkatkan kapasitas sistem. Hal ini bisa dilakukan dengan menambah server baru, atau memecah aplikasi menjadi beberapa microservices yang berjalan di server terpisah.
Contohnya seperti aplikasi e-commerce, aplikasi tersebut bisa dipecah menjadi beberapa microservices, seperti microservice user, microservice product, microservice order, dan lain sebagainya. Masing-masing microservice bisa berjalan di server terpisah, sehingga jika satu microservice mengalami kegagalan, sistem akan tetap berjalan karena ada microservice lain yang bisa menggantikan.
3. Database Sharding
Database sharding adalah proses memecah database menjadi beberapa bagian yang lebih kecil. Hal ini bisa dilakukan dengan memecah database berdasarkan kategori, misalnya memecah database user berdasarkan abjad, sehingga user dengan nama yang dimulai dengan huruf A sampai M berada di database A-M, dan user dengan nama yang dimulai dengan huruf N sampai Z berada di database N-Z.

Selain itu database sharding juga bisa dilakukan berdasarkan wilayah, misalnya memecah database berdasarkan wilayah, sehingga user yang berada di wilayah Jakarta berada di database Jakarta, dan user yang berada di wilayah Bandung berada di database Bandung. Dengan begitu, jika database mengalami kegagalan, sistem akan tetap berjalan karena ada database lain yang bisa menggantikan.
Contoh Kasus Penggunaan Horizontal Scalability
Bayangkan sebuah aplikasi e-commerce yang sedang mengalami lonjakan traffic pengunjung karena adanya promo besar-besaran. Awalnya, aplikasi tersebut berjalan di satu server dengan spesifikasi sebagai berikut:
- RAM: 8GB
- CPU: 2 Core
- Penyimpanan: 100GB SSD
Namun, ketika promo besar-besaran dimulai, aplikasi mulai mengalami penurunan performa karena beban kerja yang meningkat drastis. Hal ini disebabkan oleh beberapa faktor, seperti:
- Banyaknya user yang login secara bersamaan
- Banyaknya produk yang ditampilkan secara bersamaan
- Banyaknya order yang dibuat secara bersamaan
- Banyaknya request ke database secara bersamaan
Karena beban ini terus menumpuk di satu server, akhirnya aplikasi crash. Server yang cuma satu itu ga sanggup lagi nanganin semua request yang masuk.
Untuk mengatasi ini, tim menerapkan horizontal scaling, yaitu menambah beberapa instance atau server baru yang menjalankan aplikasi yang sama, lalu request dari user dibagi rata ke semua server itu pakai load balancer. Jadi kalau salah satu server down atau kewalahan, server lainnya masih bisa handle request yang masuk, aplikasi pun tetap jalan tanpa crash.
Kesimpulan
Balik lagi ke cerita interview gue di awal, kalau sekarang gue ketemu pertanyaan yang sama, jawaban gue bakal beda jauh. Gue gak bakal jawab upgrade RAM atau CPU lagi, tapi gue bakal jelasin dari horizontal scaling, load balancing, server horizontal, sampai database sharding. Karena buat gue, paham konsep vertical dan horizontal scalability serta cara menerapkannya itu bekal penting buat setiap software engineer, biar aplikasi yang kita bangun tetap responsif dan handal meskipun user-nya makin banyak.
Tapi bukan berarti vertical scalability jadi ga ada gunanya. Ada beberapa kasus dimana vertical scalability justru jadi pilihan yang lebih masuk akal, misalnya kalau aplikasi yang dibangun gak memungkinkan buat dipecah jadi microservices, atau budget terbatas buat nambah server baru. Vertical scalability juga cocok dipakai sebagai solusi jangka pendek waktu lagi kena lonjakan traffic mendadak dan butuh solusi cepat. Tapi perlu diingat, ini bukan solusi jangka panjang, karena ada batas fisik seberapa besar satu server bisa ditingkatkan kapasitasnya.
Semoga tulisan ini bisa jadi bekal buat yang lagi belajar atau lagi persiapan interview juga.