Melakukan pengujian performa API menggunakan K6

Pengujian performa API untuk membandingkan antara Golang Gin dengan Node.js Express dengan Database Postgresql dan MongoDB

Pendahuluan

Berdasarkan survei stackoverflow 2023 Javascript masih menjadi bahasa pemrograman paling populer. Kita dapat menjalankan Javascript pada sisi server dengan runtime paling populer yang tersedia yaitu Node.js. Golang merupakan bahasa yang sedang naik daun dan juga masuk ke dalam top 10 hasil survei dengan Gin merupakan framework yang paling Populer.
Database paling populer berdasarkan hasil survei stackoverflow 2023 adalah Postgresql untuk database SQL dan MongoDB untuk NoSQL.
Berdasarkan hal tersebut, saya ingin melakukan pengujian performa API untuk membandingkan antara Golang Gin dengan Node.js Express dengan Database Postgresql dan MongoDB untuk mencari tahu mana yang lebih baik dalam hal performa yang diberikan.

Skenario Sistem

Total sistem API akan dibuat menjadi dua sistem dengan setiap sistem API akan dikoneksikan ke dua database (Postgresql & MongoDB) yang sama untuk setiap sistem dengan fitur yang identik antar sistem

Bahan Uji

Bahan uji yang akan dikembangkan adalah sebuah API yang digunakan untuk sebuah sistem URL Shortener

Alat Pengujian

Alat pengujian menggunakan K6, sebuah alat uji performa open source dengan skenario pengujian dapat ditulis pada kode javacript

Jenis Pengujian

Jenis pengujian yang digunakan akan terdiri dari Smoke Testing, Breakpointt Testing, Load Testing, dan Spike Testing

Pengembangan API

Pengembangan Bahan Uji API (Application Programming Interfaces)

API bahan uji yang akan dikembangkan merupakan sebuah API diperuntukkan untuk Internal URL Shortener yang dengan total memiliki tiga jenis pengguna dengan total untuk bahan uji ini terdiri dari 16 endpoint yang akan dikembangkan.

Semua API yang dikembangkan akan dideploy pada Google Cloud Platform menggunakan servis Cloud Run dengan Konfigurasi yang identik antara Golang Gin dan Node.js Express sehingga dapat membandingkan performa antara kedua bahasa pemrograman tersebut.

APi dikembangkan akan menggunakan autentikas dengan menggunakan JWT (JSON Web Token) dengan skema autentikasi yang sama antara kedua API yang dikembangkan. Kedua database akan menggunakan skema ERD yang sama diaplikasikan ke dalam database Postgresql dan MongoDB.

Terkait hasil pengembangan API yang dibuat, source code dapat diakses pada repository Github yang sudah disediakan.

Golang | Gin Node.js | Express


Dokumentasi API

Pengujian Performa API

Pengujian menggunakan tools K6, sebuah tools Open Source yang digunakan untuk pengujian performa, ditulis dalam bahasa Golang serta penulisan skrip pengujian ditulis dalam Javascript. K6 Docs.

Skenario Pengujian

Setiap skenario pengujian yang akan dilakukan akan menggunakan skenario yang sama antara Golang Gin dan Node.js Express dengan database Postgresql dan MongoDB. Skenario pengujian yang akan dilakukan akan terdiri dari 4 jenis pengujian yang akan dilakukan.

  • Smoke Testing
  • Breakpoint Testing
  • Load Testing
  • Spike Testing

Smoke Testing


Pengujian sebelum melakukan pengujian lainnya untuk memastikan skenario pengujian berjalan sesuai harapan

Breakpoint Testing


Pengujian bertujuan mencari ambang batas rps (request per second) sistem yang akan digunakan sebagai dasar pengujian load dan spike testing


Load Testing


Pengujian untuk melihat bagaimana sistem menahan normal dengan juga melihat bagaimana utilisasi cpu dan memory yang digunakan sistem

Spike Testing


Pengujian untuk melihat bagaimana sistem menahan beban yang meningkat dengan cepat sampai di atas rataan beban normal sistem dan kemudian beban turun dengan cepat. Melihat hasil utilisasi cpu dan memori sistem terhadap skenario yang diberikan

Jenis Pengujian

Setiap pengujian akan memiliki karakteristik serta waktu lama pengujian yang berbeda - beda sesuai dengan tujuan dari masing - masing pengujian.

Skenario Pengujian

Detail Skenario

Total skenario pengujian yang akan diuji akan memiliki total 9 skenario dengan rincian 7 merupakan pengujian endpoint tunggal yang sudah mencangkup untuk semua jenis request dan 2 merupakan pengujian End to End (E2E) yang menggambarkan alur penggunaan endpoint dari mulai login sampai menghapus data short url yang dibuat.
Kedua pengujian E2E memiliki alur yang sama, perbedaan terdapat pada salah satu E2E tidak menggunakan proses login. Hal tersebut dikarenakan proses login terbilang cukup berat karena ada hashing maka dengan menghilangkan proses login akan dapat menjadi perbandingan dan bahan analisis lebih lanjut dengan skema yang sama dan menghilangkan satu proses yang berat bagaimana hasil dari pengujian yang dihasilkan dari semua skenario pengujian API yang akan dilakukan

Total Waktu Pengujian

Tanpa menghitung proses Breakpoint Testing yang total waktunya akan bersifat tentatif, maka menghitung waktu Load dan Spike testing yang kedua pengujian tersebut memiliki total waktu pengujian 47 menit dikalikan dengan 9 skenario pengujian dan dikalikan kembali dengan 4 total bahan uji maka total waktu pengujian paling sebentar adalah 1.692 menit atau 28 jam

Penulisan Skrip Pengujian

Skrip pengujian yang dijalankan pada K6 akan ditulis dengan kode dasar javascript. Secara umum skrip yang ditulis akan ada dua jenis struktur umum yaitu untuk pengujian satu endpoint dan untuk E2E dimana pada skrip E2E akan memanggil banyak endpoint sekaligus dalam satu skrip. Terdapat contoh untuk skrip pengujian yang akan dilakukan untuk pengujian satu endpoint dan E2E. Serta juga disediakan juga terkait repositry Github yang berisi skrip keseluruhan skrip pengujian.

Skrip Pengujian


Perfomance Testing Repository
Pengujian

Pengujian dijalankan sesuai skenario yang sudah ditulis pada setiap jenis pengujian yang akan dilakukan. Setiap skenario akan secara urut melewati jenis pengujian dari Smoke Testing, Breakpoint Testing, Load Testing, dan Spike Testing. Pengujian akan menghasilkan data yang akan digunakan untuk analisis hasil pengujian seperti iterasi per detik yang didapatkan dari Breakpoint testing, kemudian juga hasil pengujian Load dan Spike testing yang akan digunakan untuk melihat bagaimana sistem menahan beban yang diberikan yang hasil tersebut.
Pengujian yang dilakukan pada Command Line juga selain hasilkan output CLI juga menghasilkan satu file HTML berisi hasil pengujian yang dilakukan yang akan digunakan sebagai bahan analisis hasil pengujian yang dilakukan dan untuk utilisasi cpu dan memory yang digunakan sistem didapatkan dari metrik yang disediakan oleh Cloud Run.

Hasil Pengujian


Analisis

Melakukan analisis hasil pengujian yang telah dilakukan pada semua skenario pengujian. Mencari tau terkait bagaimana performa yang didapatkan oleh masih - masing skenario sistem yang telah diuji.

Nilai Pengujian Breakpoint, Load, dan Spike

Dalam tabel yang tersedia merupakan besaran iterasi per detik maksimal yang dibebankan pada Load & Spike Testing masing - masing skenario sistem yang didapatkan berdasarkan Breakpoint Testing yang dilakukan. Semakin tinggi nilai iterasi per detik yang didapatkan maka semakin baik performa sistem yang dihasilkan. Dimana beban pada load testing akan menggunakan nilai berdasar pada breakpoint testing dan juga beban pada spike testing akan berdasar pada dua kali beban pada load testing.

Nilai Utilisasi CPU & Memori

Dalam tabel yang tersedia merupakan nilai median penggunaan CPU dan Memori yang digunakan oleh kombinasi sistem, framework, dan database selama pengujian berlangsung. Semakin kecil nilai yang didapatkan maka semakin baik performa yang dihasilkan karena berarti semakin efisien.

Perbandingan Performa Get Single Link

Pemilihan endpoint Get Single Link dikarenakan merupakan endpoint yang mendapatkan nilai iterasi per detik paling tinggi pada semua skenario sistem.

Perbandingan Performa E2E tanpa Login

Membandingkan hasil E2E tanpa login dikarenakan pada pengujian ini semua skenario sistem diberikan beban maksimal yang sama. Sehingga dapat melihat bagaimana perilaku tiap skenario sistem yang diuji ketika beban yang diberikan adalah sama.


Perbandingan Waktu Pemrosesan Sistem

Waktu pemrosesan permintaan per detik pada kombinasi setiap sistem yang diuji.

Hasil Akhir

Terdapat beberapa poin kesimpulan dan hasil akhir percobaan perbandingan yang sudah dilakukan dengan total empat bahan uji yang melibatkan kombinasi antara Golang Gin, Node.js Express, Postresql, dan MongoDB dengan alat uji K6

Golang lebih baik dari Node.js

Golang Gin umumnya lebih unggul dari Node.js Express, dengan hasil breakpoint 15 vs 14, dan penggunaan CPU dan memori yang lebih efisien saat load testing (CPU 17,57%, memori 7,32% dibandingkan dengan Node.js yang membutuhkan CPU 22,09% dan memori 24,8%).

Postgresql lebih baik dari MongoDB

PostgreSQL lebih baik dari MongoDB, dengan hasil breakpoint 26,5 vs 8, serta penggunaan CPU dan memori yang lebih rendah (CPU 8,76%, memori 7,72% dibandingkan dengan MongoDB yang memerlukan CPU 27,36% dan memori 15,83%).

Kombinasi Golang Postgresql hasilkan performa terbaik

Kombinasi Golang dan PostgreSQL memberikan performa terbaik dengan median 32 dalam breakpoint testing, yang merupakan nilai tertinggi. Pada pengujian iterasi per detik tertinggi, dalam perbandingan performa yang didapat pada nilai iterasi tertinggi, Golang-PostgreSQL mencapai tingkat keberhasilan 99% dalam load dan spike testing, dengan median waktu pemrosesan 193ms (P95 398ms) untuk load testing dan 416ms (P95 1s) untuk spike testing. Golang memproses 81 iterasi per detik, lebih banyak dibanding Node.js yang mencapai 68 iterasi per detik yang ada pada peringkat dua.

Golang Postgresql memberikan performa baik dan stabil pada perbandingan beban yang sama

Pada pengujian end-to-end tanpa login yang semua skenario sistem diuji pada beban yang sama, Golang-PostgreSQL juga menunjukkan performa paling stabil. Untuk metrik permintaan per detik, Golang-PostgreSQL mencapai median 229ms (P95 10 detik) pada load testing dan 431ms (P95 14,3 detik) pada spike testing. Sedangkan untuk iterasi per detik, median waktu yang dicapai adalah 5,11 detik (P95 18,1 detik) pada load testing dan 556ms (P95 15,24 detik) pada spike testing, menjadikannya hasil terbaik di tiap skenario yang diuji.

Hasil dan Rekomendasi

Berdasarkan hasil pengujian API yang membandingkan performa dua framework—Golang Gin dan Node.js Express—serta dua database—PostgreSQL dan MongoDB—dengan studi kasus URL Shortener, disarankan menggunakan kombinasi Golang Gin dan PostgreSQL untuk skenario serupa. Kombinasi ini menunjukkan performa terbaik dengan efisiensi sumber daya yang optimal.