Topik ini menjelaskan performa plugin bawaan dari Cloud-native API Gateway dan plugin kustom yang dikembangkan menggunakan berbagai bahasa pemrograman. Performa dinilai berdasarkan latensi permintaan.
Performa plugin bawaan
Plugin bawaan dari Cloud-native API Gateway menawarkan latensi dalam orde mikrodetik. Sebagai contoh, plugin key-auth memproses setiap permintaan dengan latensi sekitar 20 mikrodetik, sedangkan plugin basic-auth memproses setiap permintaan dengan latensi sekitar 30 mikrodetik.
Performa plugin kustom
Contoh berikut membandingkan performa beberapa plugin yang dikembangkan menggunakan berbagai bahasa pemrograman. Semua plugin digunakan untuk mengimplementasikan logika pemrosesan berikut: Header permintaan diatur sebanyak 20 kali berturut-turut, diperoleh sebanyak 20 kali berturut-turut, lalu dihapus sebanyak 20 kali berturut-turut.
Kode sampel untuk plugin kustom yang dikembangkan menggunakan C++
FilterHeadersStatus PluginContext::onRequestHeaders(uint32_t, bool) { std::string fake_header_key_prefix = "fake_key_"; std::string fake_header_value_prefix = "fake_value_"; // Tambahkan 20 header ke header permintaan for (size_t i = 0; i < 20; i++) { addRequestHeader(fake_header_key_prefix + std::to_string(i), fake_header_value_prefix + std::to_string(i)); } // Periksa header sebanyak 20 kali. for (size_t i = 0; i < 20; i++) { getRequestHeader(fake_header_key_prefix + std::to_string(i)); } // hapus header tambahan for (size_t i = 0; i < 20; i++) { removeRequestHeader(fake_header_key_prefix + std::to_string(i)); } return FilterHeadersStatus::Continue; }Kode sampel untuk plugin kustom yang dikembangkan menggunakan Golang
func (ctx *httpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action { fake_header_key_prefix := "fake_key_" fake_header_value_prefix := "fake_value_" for i := 0; i < 20; i++ { proxywasm.AddHttpRequestHeader(fake_header_key_prefix+strconv.Itoa(i), fake_header_value_prefix+strconv.Itoa(i)) } for i := 0; i < 20; i++ { proxywasm.GetHttpRequestHeader(fake_header_key_prefix + strconv.Itoa(i)) } for i := 0; i < 20; i++ { proxywasm.RemoveHttpRequestHeader(fake_header_key_prefix + strconv.Itoa(i)) } return types.ActionContinue }Kode sampel untuk plugin kustom yang dikembangkan menggunakan Rust
fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action { for i in 0..20 { let key = "fake_key_".to_string() + &i.to_string(); let value = "fake_value_".to_string() + &i.to_string(); self.set_http_request_header(&key, Some(&value)); } for i in 0..20 { let key = "fake_key_".to_string() + &i.to_string(); self.get_http_request_header(&key); } for i in 0..20 { let key = "fake_key_".to_string() + &i.to_string(); self.set_http_request_header(&key, None); } Action::Continue }Kode sampel untuk plugin kustom yang dikembangkan menggunakan AssemblyScript
function onRequestHeaders(a: u32, end_of_stream: bool): FilterHeadersStatusValues { let fake_header_key_prefix: string = "fake_key_"; let fake_header_value_prefix: string = "fake_value_"; for (let i = 0; i < 20; i++) { stream_context.headers.request.add(fake_header_key_prefix + i.toString(), fake_header_value_prefix + i.toString()) } for (let i = 0; i < 20; i++) { stream_context.headers.request.get(fake_header_key_prefix + i.toString()) } for (let i = 0; i < 20; i++) { stream_context.headers.request.remove(fake_header_key_prefix + i.toString()) } return FilterHeadersStatusValues.Continue; }
Perbandingan performa di antara plugin kustom yang dikembangkan berdasarkan bahasa berbeda
Bahasa pemrograman | Peningkatan latensi permintaan |
C++ | 0,19 ms |
Golang | 0,20 ms |
Rust | 0,21 ms |
AssemblyScript | 0,21 ms |
Hasil perbandingan menunjukkan bahwa plugin kustom yang dikembangkan menggunakan berbagai bahasa pemrograman memberikan performa serupa dalam hal latensi permintaan.