Artikel ini membandingkan operasi layanan paling sederhana yang diterapkan menggunakan kerangka kerja Camel dan dua komponennya: HTTP dan AHC. Kami tidak akan mempelajari struktur dan bekerja dengan kerangka itu sendiri, diasumsikan bahwa pembaca sudah sedikit mengenalnya.
Kami akan mempertimbangkan layanan Camel sederhana yang menerima permintaan dari komponen jetty, memprosesnya, misalnya, menampilkannya di log, memanggil layanan lain melalui http, dan memproses respons darinya, misalnya, menulis ke log.
Untuk pengujian, skrip JMeter digunakan untuk memanggil layanan kami sesuai dengan frekuensi dan interval yang direncanakan, serta layanan Http kecil yang berperan sebagai eksternal layanan kami dan melakukan penundaan selama 5 detik. Semua komunikasi terjadi pada loop lokal (127.0.0.1), sehingga latensi jaringan tidak diperhitungkan, tetapi tidak diperlukan untuk analisis komparatif.
Komponen HTTP
Bagian ini akan melihat komponen HTTP standar untuk komunikasi HTTP. Kode layanan sederhana:
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.to("http://{{another.url}}")
.log("finish process body ${body}");
Catatan: Menghapus header yang dimulai dengan "CamelHttp" diperlukan karena mereka diekspos di komponen Jetty dan dapat mempengaruhi operasi komponen Http.
Untuk menguji kerja layanan ini, mari jalankan skrip JMeter yang mengirimkan 25 permintaan secara bersamaan.
Sampel |
Min |
Max |
Kesalahan% |
25 |
5012 |
7013 |
20.000% |
, 20% 5 25 (Read timed out). , http- 20 . connectionsPerRoute
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.to("http://{{another.url}}?connectionsPerRoute=200")
.log("finish process body ${body}");
25 . – jetty-, 200. 4 JMeter:
200
300
300 5 , 5
200 5 , 5
1 JVM 214 , .
:
|
|
200 |
0% |
300 |
34.667% |
300 5 |
71.733% |
200 5 |
0% |
300 , 200 jetty-, 100 jetty, 5 , 10. 34% – 100 .
, – 300 5 , 5 , .. 60 , 200 5 , .
, , , , jetty- .
, jetty-, JVM 1 , Docker- , . .
AHC-
AHC- - Camel HTTP. AsyncHttpClient, () . – http- , , .. 5 . , . :
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.to("ahc:http://{{another.url}}")
.log("finish process body ${body}");
, 300 . , http- . JVM:
, . :
|
|
300 5 |
0% |
800 5 |
0% |
1200 5 |
1.533% |
1600 5 |
15.02% |
, , .
, , 1200 1600 http-, - , .
AHC-
AHC-, . :
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.setHeader("rand", ()->new Random().nextInt(10000) )
.toD("ahc:http://{{another.url}}?rand=${headers.rand}")
.log("finish process body ${body}");
Setelah menjalankan skrip dengan permulaan 300 permintaan satu kali, status utas di JVM:
Seperti yang Anda lihat, terlalu banyak aliran. Faktanya adalah bahwa secara default, komponen AHC untuk setiap titik akhir membuat instance sendiri dari objek AsyncHttpClient, yang masing-masing memiliki kumpulan koneksi dan utasnya sendiri, sebagai hasilnya, untuk setiap permintaan, 2 utas dibuat - satu utas I / O, utas pengatur waktu lain untuk mengontrol waktu tunggu dan menjaga koneksi dalam status KeepAlive. Untuk menghindari hal ini, Anda perlu mengonfigurasi instance AsyncHttpClient di tingkat komponen, yang akan diteruskan ke titik akhir saat dibuat.
AhcComponent ahc = getContext().getComponent("ahc", AhcComponent.class);
ahc.setClient(new DefaultAsyncHttpClient());
Setelah itu, pembuatan banyak instance AsyncHttpClient akan berhenti.