Uji beban kinerja GraphQL dengan k6 dan StepZen | Oleh Roy Derks | Juni 2022

Programming

[ad_1]
Halo Sob di suratpembaca.web.id. Kali ini kita akan membahas tentang Linux yaitu Uji beban kinerja GraphQL dengan k6 dan StepZen | Oleh Roy Derks | Juni 2022

.

Sekiranya artikel mengenai Uji beban kinerja GraphQL dengan k6 dan StepZen | Oleh Roy Derks | Juni 2022

dapat memberikan manfaat untuk Teman-teman semua. Langsung saja baca artikel ini
hingga selesai.

Panduan singkat untuk pengujian beban yang lebih mudah

Unduh fungsi GraphQL dengan k6 dan StepZen

Bagi banyak perusahaan, kinerja adalah alasan utama menggunakan GraphQL. Tapi apakah ini argumen yang valid? Sebagian besar pengembang membandingkan GraphQL dengan REST API, mengutip permintaan N + 1 (atau pengambilan berlebihan) sebagai alasan penting untuk memilih GraphQL.

Mari kita uji dan lihat apakah GraphQL API dapat berperforma lebih baik daripada REST API yang ada. Untuk melakukan ini, kami mengambil dua API REST berbasis GraphQL (IP-API dan Frankfurter) dan menguji kinerja GraphQL, data bersarang di GraphQL, dan membandingkannya dengan REST API asli.

Untuk melakukan pengujian kinerja ini, kami akan menggunakan alat k6, salah satu alat pengujian beban paling populer saat ini.

Mari kita lihat StepZen GraphQL API yang dikonversi dari REST API. Dalam hal ini, saya menggunakan StepZen CLI untuk mengonversi IP-API REST API ke GraphQL menggunakan instruksi dokumentasi. REST API gratis ini memungkinkan Anda mencari lokasi berdasarkan alamat IP-nya. Kami menjelajahi REST API dengan GraphQL IP-API dengan StepZen dan menjelajahinya dengan GraphiQL. Antarmuka GraphiQL dapat ditemukan di sini dan adalah sebagai berikut:

IP-API di GraphiQL

Anda dapat melihat permintaan yang Anda kirim ke GraphQL API di sisi kiri halaman, sedangkan sisi kanan menunjukkan jawabannya. Telah bernama GetLocation. Kueri penamaan disarankan karena membantu cache GraphQL API, misalnya. Perhatikan juga bahwa jawabannya sama dengan formulir permintaan yang Anda minta.

Setelah meninjau GraphQL API ini, mari kita konfigurasikan k6 agar kita dapat menggunakannya untuk menguji GraphQL di bagian selanjutnya.

Gunakan k6 untuk GraphQL

Untuk mengunduh pengujian GraphQL API ini, kami akan menggunakan k6, alat pengujian beban sumber terbuka. Anda dapat menjalankan k6 di perangkat lokal Anda dengan menginstalnya dari repositori GitHub atau menggunakan penawaran cloud k6. Dengan alat ini, Anda dapat menguji API apa pun yang menerima permintaan HTTP. Ini menggunakan tes paling sederhana yang dapat Anda jalankan http.post Fungsi k6. Ini juga kodenya:

Skrip k6 ini sekarang dapat mengetuk GraphQL API menggunakan kueri untuk menguji kinerjanya. Karena alamat IP sudah diperbaiki, k6 mengirimkan permintaan yang sama berulang kali dalam pengujian kinerja Anda.

Selain itu, karena GraphQL API menyimpan hasil, eksperimen menjadi kurang nyata karena pengguna yang berbeda menggunakan alamat IP yang berbeda saat mengetuk GraphQL API. Jadi, Anda perlu menggunakan variabel dinamis dalam kueri GraphQL Anda. Kueri yang sama dengan nilai dinamis untuk ip Ini akan terlihat seperti ini:

query GetLocation($ip: String!) 
ipApi_location(ip: $ip)
ip
city
country

Saat mengirimkan permintaan, Anda harus menambahkan objek JSON yang berisi nilai ke ip Di sebelah kueri GraphQL Anda. Jika Anda mengunjungi antarmuka GraphiQL, Anda dapat menggunakan tab “Parameter Kueri” untuk melakukan ini:

Kueri dengan parameter dinamis di GraphiQL

Anda dapat menggunakannya dengan parameter kueri dinamis http.batch K6 berfungsi untuk mengirim beberapa permintaan dengan nilai yang berbeda untuk ip Ke GraphLQ API untuk mensimulasikan skenario pengujian yang lebih realistis:

Menjalankan skrip ini k6 mengirimkan banyak permintaan dengan alamat IP yang berbeda ke GraphQL API. Permintaan ini dikirim secara paralel dan memberi Anda skenario yang lebih realistis daripada hanya mengirim. Anda juga dapat membuat dan mengatur larik alamat IP untuk membuat larik baru yang Anda kirim. http.batch Fungsi. Bagian selanjutnya menggunakan skrip ini untuk menguji kinerja API GraphQL ini dengan k6.

Unduh tes Query GraphQL

Dengan menjalankan skrip k6, sekarang kita dapat melakukan pengujian kinerja pada GraphQL API. Kami dapat menjalankan dua eksperimen, satu dengan alamat IP tetap dan yang lainnya dengan permintaan batch dan alamat IP dinamis. Anda hanya perlu mengunduh dan menginstal k6 di perangkat lokal Anda untuk menjalankan tes ini, atau Anda harus memiliki akun cloud k6.

Untuk menjalankan tes pertama, Anda harus menyimpan skrip dalam file bernama simple.js Jadi Anda dapat menjalankan tes dengan yang berikut ini:

k6 run --vus 10 --duration 30s simple.js

Perintah ini mengeksekusi k6 dengan 10 VU (pengguna virtual) selama 30 detik. Klik di sini untuk informasi lebih lanjut tentang menjalankan k6.

Unggah hasil tes k6

Hasilnya menunjukkan bahwa GraphQL API dipukul sekitar 2.500 kali dalam 30 detik dengan durasi rata-rata 122 milidetik. Ini sangat dekat dengan waktu kunjungan rata-rata untuk 95% dari semua permintaan, artinya tidak ada outlet.

Dengan melihat hasilnya, kita dapat menguji skalabilitas dari GraphQL API yang berjalan di StepZen. Jadi kita perlu melihat lebih dekat jumlah iterasi yang dilakukan GraphQL API:

iterations.....................: 2472 82.082529/s

Ketika kami menjalankan skrip k6 selama 30 detik dengan sepuluh VU secara bersamaan, Anda melihat bahwa k6 menyentuh GraphQL API sekitar 2500 kali atau 82 kali per detik. Jika GraphQL API sepenuhnya dapat diskalakan, ia harus mampu menangani sepuluh kali lebih banyak iterasi saat kami meningkatkan jumlah VU bersamaan menjadi 100. Mari kita coba ini:

k6 run --vus 100 --duration 30s simple.js

Ini mengarah pada hal berikut:

Unggah hasil tes k6

Seperti yang diharapkan untuk layanan yang sepenuhnya skalabel, jumlah iterasi bukan 820 tetapi 798, yang hanya berbeda 3%. GraphQL API tidak sepenuhnya dapat diskalakan, tetapi hampir mendekati.

Selain menguji kueri sederhana dengan alamat IP tetap, kita dapat menjalankan skrip dengan alamat IP dinamis dengan menempatkannya dalam file bernama. batch.js:

k6 run --vus 10 --duration 30s batch.js

Iterasi GraphQL API dalam pengujian ini dikirim dalam batch, artinya setiap iterasi menghasilkan tiga permintaan HTTP – jumlah permintaan yang dikirim ke http.batch Fungsi. Seperti yang kita pelajari sebelumnya, GraphQL API hampir seluruhnya dapat diskalakan.

Jumlah iterasi yang dapat dilakukan GraphQL API dalam pengujian ini harus hampir sama, sedangkan jumlah permintaan HTTP harus sekitar tiga kali lebih tinggi. Ketika saya menjalankan tes, jumlah pengulangan sampai pada kesimpulan ini:

http_reqs......................: 7251   240.737555/s
iteration_duration.............: avg=124.43ms min=116.53ms med=121.91ms max=509.1ms p(90)=126.39ms p(95)=129.13ms
iterations.....................: 2417 80.245852/s

Dengan 2417 vs. 2500 permintaan, jumlah duplikat sebanding, dan jumlah permintaan HTTP tiga kali lipat jumlah duplikat.

Kita sekarang tahu bahwa k6 dapat menguji kinerja GraphQL API dan GraphQL API dapat diskalakan. Mari beralih ke pengujian kueri GraphQL yang lebih berat di bagian selanjutnya.

Unggah tes dari berbagai sumber data

Kemampuan untuk membentuk data bukan satu-satunya alasan pengembang memilih GraphQL sebagai bahasa kueri untuk API mereka. GraphQL API hanya memiliki satu titik akhir, dan kueri (atau operasi lain) juga dapat menangani data bersarang. Anda dapat meminta data dari tabel database yang berbeda (seperti koneksi SQL) atau bahkan sumber data yang berbeda dalam satu permintaan. Ini berbeda dengan REST API, di mana Anda biasanya harus memasukkan beberapa titik akhir untuk menerima data dari sumber lain.

Di antarmuka GraphiQL untuk StepZen GraphQL API yang kami uji, Anda dapat menemukan kueri lainnya. Salah satu kueri ini menerima data dari Frankfurter REST API, sebuah API open source yang berisi data nilai tukar saat ini dan historis yang diterbitkan oleh Bank Sentral Eropa.

REST API ini dikonversi ke GraphQL menggunakan StepZen dengan cara yang sama seperti IP-API. Untuk mendapatkan nilai konversi saat ini dari Euro ke Dolar AS, Anda dapat menanyakan:

query GetConversion 
frankfurter_latest_rates(from: "EUR", to: "USD")
amoun
base
date
rates

Permintaan di atas menerima tarif panggilan dari 1 Euro ke USD pada tanggal saat ini. Karena desain API adalah kombinasi dari data IP-API dan Frankfurter, Anda dapat melakukan lebih banyak hal. Dengan menggunakan kombinasi ini, Anda bisa mendapatkan lokasi saat ini berdasarkan alamat IP dan mengonversi mata uang lokal lokasi tersebut ke USD.

Konversi mata uang ini tersedia di lapangan priceInCountry. Anda dapat melihat hasilnya dengan mengacu pada antarmuka GraphiQL atau pada gambar di bawah ini:

Cari sumber data yang berbeda dengan StepZen

Selain lokasi alamat IP, kueri ini juga memungkinkan GraphQL API untuk mengonversi Euro ke mata uang lokal di lokasi tersebut. Dalam hal ini, itu berarti mengubah euro menjadi dolar.

Untuk mendapatkan data ini, GraphQL API melakukan hal berikut:

  • Kirim permintaan ke IP IP-API REST API untuk menerima lokasi dan mata uang berdasarkan alamat IP.
  • Konverter mata uang ke Euro menggunakan Frankfurter REST API.

Kita dapat menggunakan kueri bersarang ini dalam skrip k6 untuk menguji kinerja lain dari GraphQL API. Kueri ini memiliki kedalaman yang berbeda dari kueri yang kita gunakan di bagian sebelumnya, karena data sekarang disarangkan karena berasal dari sumber yang berbeda. Anda dapat meletakkan skrip k6 berikut di file baru bernama nested.js:

Dan jalankan dalam kondisi yang sama seperti tes sebelumnya:

k6 run --vus 10 --duration 30s nested.js

Hasil tes ini serupa dalam kinerja dengan permintaan batch. Klasifikasi tidak dilakukan di skrip k6, tetapi di GraphQL API, yang menangani dua permintaan ini ke REST API di bawah ini.

Karena GraphQL API dibuat untuk kinerja, perbedaan antara kueri awal untuk mendapatkan lokasi alamat IP dan kueri ini untuk mendapatkan lokasi alamat IP dan konversi mata uang adalah minimal. Apa yang dapat Anda periksa di output uji beban k6 di bawah ini:

Hasil uji pemuatan k6 mencari sumber data yang berbeda

Eksperimen terbaru menunjukkan bahwa GraphQL cukup mampu mengambil data Anda dari berbagai sumber dalam satu permintaan. Mari kita urai kueri GraphQL ke dalam permintaan REST API yang mereka buat di bagian terakhir untuk membuktikannya.

Anda telah mempelajari cara menguji GraphQL menggunakan k6 dan perbedaannya dengan pengujian REST API. Permintaan GraphQL terakhir yang kami uji memanggil dua titik akhir REST API yang berbeda. Ada dua skenario di mana kita dapat membandingkan kinerja GraphQL dan REST.

Siapkan dua pengujian terpisah untuk membandingkan kinerja masing-masing titik akhir REST dengan kueri GraphQL yang sesuai, atau buat ulang seluruh perilaku API GraphQL dengan langsung memanggil dua titik akhir REST API dari pengujian k6.

Kasus kedua adalah yang paling menarik untuk diuji, karena kedua titik akhir REST harus mengembalikan data untuk menyelesaikan kueri GraphQL. Perilaku kueri GraphQL yang kami uji adalah:

query GetConversion($ip: String!, $amount: Float!, $from: String!) 
ipApi_location(ip: $ip)
ip
cit
country
currency
priceInCountry(amount: $amount, from: $from)

Mengirimkan permintaan ini ke titik akhir REST:

Untuk menguji ini menggunakan k6, Anda perlu mengatur skrip berikut ke file baru rest.js:

Tes kinerja k6 ini tidak hanya memanggil dua titik akhir REST. Tetapi dalam skenario dunia nyata, tidak masuk akal untuk mencapai titik akhir kedua untuk mengonversi mata uang tempat ke euro jika permintaan mata uang lokal pertama tidak mengembalikan alamat IP.

Lakukan pengujian di atas dengan kondisi yang sama seperti yang kami lakukan untuk pengujian lainnya:

k6 run --vus 10 --duration 30s rest.js

Ini memberikan hasil berikut:

Hasil untuk uji beban K6 REST

Hal pertama yang menonjol adalah hanya 50 iterasi yang diselesaikan dengan dua permintaan HTTP per iterasi dalam 30 detik. Hanya 3 VU yang dapat mengirimkan permintaan dalam pengujian ini dan 20% dari total permintaan tidak berhasil. Dibandingkan dengan GraphQL API, hasil pengujian ini mengecewakan. Versi grafik dari dua API REST dapat menangani lebih banyak permintaan dan menyelesaikannya lebih cepat. kenapa ini?

GraphQL API yang dibuat menggunakan StepZen menerapkan penyimpanan di mana tampaknya REST API itu sendiri tidak menerapkan caching apa pun. Permintaan ke titik akhir IP-API tampaknya gagal 20% dari waktu. Selain itu, GraphQL API juga mengkategorikan permintaan atau mengoptimalkannya untuk N+1 permintaan sesuai kebutuhan. Misalnya, Anda harus meminta data yang sama dua kali dari API mata uang REST.

Penggunaan GraphQL telah meningkat, terutama di kalangan pengembang front-end yang menginginkan cara yang lebih transparan dalam mengelola data. Dalam posting ini, kita akan melihat cara menguji kinerja API GraphQL menggunakan k6. GraphQL API ini dibuat dengan StepZen dengan mengonversi REST open source API dari IP-API dan Frankfurter. Hasil pengujian menunjukkan bahwa GraphQL API sepenuhnya dapat diskalakan dan efisien di hampir semua skenario.

Sebaliknya, titik akhir REST API individu memiliki masalah kinerja yang signifikan dalam pengujian. Ini karena optimalisasi kinerja StepZen GraphQL API, seperti cache. Untuk skrip uji kinerja lengkap untuk GraphQL, lihat alat benchmark StepZen GraphQL di repositori ini.

Want to connect?Learn more or ask questions about StepZen on the Discord here.

Itu tadi pembahasan mengenai Uji beban kinerja GraphQL dengan k6 dan StepZen | Oleh Roy Derks | Juni 2022

, terimakasih telah berkunjung di website saya, semoga informasinya ada manfaatnya ya.

[ad_2]

Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.