Sapu lidi kuat bukan karena gagangnya, akan tetapi karena banyak lidi-lidi kecil yang bergabung bersama.

  • The philosopher

Pendahuluan

Sebuah aplikasi/software yang berkembang, lambat laun akan mengalami yang namanya bottleneck/kemacetan.

Kemacetan di salah satu sistem yang ada di dalam aplikasi.

Misalnya :

  • Macet di waktu menyimpan data ke database karena banyaknya request yang masuk secara bersamaan.
  • Macet di waktu mengakses data yang ada di queue, karena harus antri beberapa menit agar bisa memproses data yang masuk.
  • Macet di waktu mengambil index dokumen di daftar index search engine, karena data yang banyak dan index yang banyak, melebihi ekspektasi.
  • dll.

Bottleneck ini biasanya diatasi dengan Scaling.

Tentunya selain itu bisa juga dengan menganalisa proses yang ada di dalam aplikasi agar lebih efektif dalam mengakses dan menulis sesuatu.

Tapi itu adalah bahasan lain yang dibahas di lain kesempatan.


Scaling ?

Kasus Bottleneck biasanya menyangkut sistem lain yang kita akses.

Seperti disebutkan diatas, sistem lain itu bisa saja :

  • Database
  • Messaging Server
  • Indexing Server
  • dll

Bottleneck biasanya terjadi karena ketersediaan server untuk kita pakai diatas misalnya terbatas, cuma satu saja dipakai untuk banyak aplikasi, maka kemacetan / bottlenect pasti akan terjadi.

Satu server bisa berarti hanya 1 CPU, 1 Memori, 1 Bandwith jaringan, dll.

Sementara yang minta akses banyak.

Scaling merupakan cara untuk membuat server-server diatas menjadi lebih Powerful sehingga bisa menangani banyak aplikasi dan permintaan dari aplikasi lain.

Ada 2 teknik scaling :

  • Vertical Scaling, yaitu menambah kapasitas hardware dari sebuah server, seperti menambah CPU, Memori, Bandwith dan hardisk. Akan tetapi terdapat batasan maksimum dari sebuah hardware bisa discaling. Contohnya di AWS, kita mengubah tipe EC2 instance dari a1.medium yang punya 1 CPU dan 2 GB memori ke t3.large yang mempunyai 2 CPU dan 8 GB memori.

  • Horizontal Scaling, yaitu membagi beban yang diterima oleh satu server ke banyak server. Tiap server dari banyak server itu tidak akan mendapatkan beban load yang tinggi, karena loadnya dibagi. Misalnya bisa kita lihat di teknik Load Balancer, Sharding, Master / Worker, Tuple Space, dll


Sharding ?

Sharding adalah salah satu teknik dari Horizontal Scaling

Alih-alih menambah CPU, Memori, Bandwidth, Hardisk dari satu server yang ada, maka yang dilakukan adalah menambah server baru dengan spesikasi yang sama, kemudian membagi beban ke semua server yang lama dan baru agar seimbang, dengan cara mengasosiasikan tiap server dengan subset data yang berbeda.

Tujuan utama Sharding adalah memang membagi data yang berbeda diproses oleh server yang berbeda.

Disinilah letak pembagian bebanya.

Sehingga efeknya adalah :

  • Data yang masuk ke sebuah sistem memakai teknik Sharding akan berada dalam group server yang biasa disebut Cluster.
  • Data yang diproses oleh sebuah server, tidak akan diproses lagi oleh server yang lain.
  • Proses pembagian beban data antara server yang ada akan menggunakan teknik-teknik optimasi distribusi agar bebannya bisa berimbang. Misalnya memakai hashkey, indexKey, Distribution Management seperti Zookeper, Server Pooling, dll.
  • Perlu adanya server/program khusus untuk mengelola server yang tiba-tiba mati, keluar dari cluster, atau ada penambahan server baru.
  • dll

Kalau kita lihat, banyak sistem yang dari awal sudah memakai teknik ini, terutama sistem yang dari awal didesain agar terdistribusi, misalnya :

  • Elastic Search
  • Kafka
  • MongoDB Shard
  • Blockchain
  • Datawarehousing
  • dll