Motivasi
Arsitektur microservice memungkinkan Anda untuk memilih antara teknologi dan bahasa pemrograman saat menulis layanan api REST. Bahasa mana yang lebih baik untuk dipilih saat menulis aplikasi api REST untuk memberikan pengguna yang lebih cepat jawaban stabil dan cepat pada perangkat keras yang sama? Untuk menjawab pertanyaan ini, alangkah baiknya untuk melihat perbedaan dalam kinerja aplikasi yang sama yang ditulis dalam Java dan GO.
Penafian
Semua hasil yang disajikan dalam percobaan ini adalah contoh khusus dari penggunaan Java dan GO dan tidak boleh digunakan untuk menggambarkan kinerja bahasa-bahasa ini dalam kondisi lain.
Syarat / Ketentuan
- Tidak ada pengaturan tambahan untuk meningkatkan produktivitas. Kerangka kerja dan pustaka harus digunakan dengan pengaturan default.
- Tidak ada kerangka kerja ORM. Hanya driver basis data dan permintaan yang sama di kedua aplikasi.
Rencanakan
- Mari kita buat dua aplikasi api REST sederhana di Java dan GO dengan database PostgreSQL
- Buat tes beban dengan Jmeter
- Jalankan setiap aplikasi, database, dan tes pada instance AWS yang terpisah
- Jalankan tes dan kumpulkan hasil
Aplikasi tes
Sebagai sistem untuk pengujian, saya membuat dua aplikasi:
bank-java dan
bank-go . Ini mungkin aplikasi bank paling sederhana di dunia. Yang bisa dilakukan hanyalah menciptakan pelanggan baru dengan saldo awal, mentransfer dana dari satu klien ke klien lain dan menunjukkan saldo.
API:- Pos / klien / baru / {saldo} - menciptakan klien dengan saldo awal
- Posting / transaksi - mentransfer dana dari satu klien ke klien lain
- Dapatkan / client / {id} / balance - menunjukkan saldo
Kerangka kerja dan perpustakaan
Ketika memilih tumpukan itu, saya menggunakan kerangka kerja dan perpustakaan terbaru, paling populer dan paling sederhana untuk mengimplementasikan fungsi yang diperlukan secepat mungkin.
Bank-java: Java 11, spring boot 2.0.4, spring-web 5.0.8, PostgreSQL JDBC 4.2.4
Bank-go: Go 1.8, gorilla / mux, github.com/lib/pq
Lingkungan uji
AWS digunakan sebagai lingkungan pengujian.
Mesin virtual EC2 berikut ini dibuat:
- T2.micro Bank-go (Variabel ECU, 1 vCPUs, 2,5 GHz, Intel Xeon Family, 1 memori GiB, hanya EBS)
- Bank-java t2.micro (Variabel ECU, 1 vCPU, 2,5 GHz, Intel Xeon Family, 1 memori GiB, hanya EBS)
- Postgres d2.xlarge (14 ECU, 4 vCPUs, 2,4 GHz, Intel Xeon E52676v3, 30,5 GiB memory, 3 x 2048 GiB Storage Capacity)
- Uji bank t2.2xlarge (ECU variabel, 8 vCPU, 2.3 GHz, Intel Broadwell E5-2686v4, memori 32 GiB, hanya EBS)
Semua contoh menggunakan Ubuntu Server 18.04 LTS (HVM), Tipe Volume SSD

Proyek uji
Tes Jmeter memanggil setiap API dari daftar di atas, memeriksa bahwa status responsnya adalah 200 dan badan respons berisi id. Untuk setiap aplikasi, saya meluncurkannya dengan jumlah pengguna simultan 1000, 2000, dll. hingga 10.000.
Log lengkap hasil dapat ditemukan di
sini .
Hasil Agregat



Deskripsi hasil
Kedua aplikasi bekerja dengan sempurna dengan jumlah pengguna 1000. Dimulai dengan 2000 GO, aplikasi mulai kehilangan kinerja secara signifikan dan sedikit stabil. Di Jawa, baris ini dimulai dengan 3000.
Kesimpulan
Menggunakan perangkat keras REST api yang sama, aplikasi Java dapat mendukung pengguna bersamaan * dua kali lebih banyak daripada aplikasi GO dengan database PostgreSQL.
* Angka ini hanya berlaku ketika menggunakan kondisi pengujian yang sama seperti dalam percobaan ini.