HeadlinesBriefing HeadlinesBriefing.com

Penggunaan Ulang Koneksi HTTP/1 yang Lebih Baik di Go

Hacker News •
×

Perhatikan fungsi ini, yang mengirim permintaan GET ke sebuah URL dan mengembalikan kode status HTTP. Dengan menggunakan HTTP/1 (GODEBUG=http2client=0), memanggilnya 100 kali ke index.golang.org memerlukan sekitar 710 milidetik pada Go 1.26 di mesin penulis. Pada Go 1.27, program yang sama memerlukan sekitar 150 milidetik, hampir 5 kali lebih cepat.

Selisih ini berasal dari biaya membangun koneksi. Mengirim permintaan melalui koneksi baru memerlukan handshake TCP (1 round-trip time, atau RTT), handshake TLS (2 RTT pada TLS 1.2), dan kemudian permintaan HTTP itu sendiri, dengan total sekitar 3 RTT. Dalam komunikasi lintas wilayah, latensi satu arah sering mencapai atau melebihi 50 md, sehingga proses pengaturan saja bisa memakan sekitar 300 md. Bahkan dengan index.golang.org, yang menggunakan TLS 1.3 dan menawarkan latensi yang relatif rendah, membuka koneksi baru tetap sangat terasa.

Untuk menghindari biaya ini, klien dan server HTTP berusaha menggunakan kembali koneksi. Klien dan server HTTP/1.0 mengaktifkannya dengan header Connection: keep-alive, sedangkan koneksi HTTP/1.1 bersifat persisten secara default. HTTP/2 memultipleks beberapa permintaan dan respons melalui satu koneksi TCP.

Namun, penggunaan ulang dapat gagal pada HTTP/1. Respons pada koneksi yang sama dikirim secara berurutan, sehingga net/http hanya dapat menemukan awal respons berikutnya setelah badan respons saat ini dibaca sampai habis. Dalam contoh, badan respons tidak pernah dibaca, sehingga ketika resp.Body.Close dipanggil, net/http menemukan badan yang belum dibaca dan tidak dapat menggunakan kembali koneksi dengan aman. Hingga Go 1.26, hal ini memaksa koneksi baru untuk setiap permintaan.

Sumber: Hacker News · Diringkas oleh HeadlinesBriefing