Go 1.27'de HTTP/1 Bağlantı Yeniden Kullanımında Performans Artışı

Go 1.27'de HTTP/1 Bağlantı Yeniden Kullanımında Performans Artışı
audio-thumbnail
Go 1.27'de HTTP/1 Bağlantı Yeniden Kullanımında Performans Artışı
0:00
/0

Go 1.27'de HTTP/1 Bağlantı Yeniden Kullanımında Performans Artışı

Bir HTTP isteği göndermek, her ne kadar basit görünebilse de, aslında bir dizi karmaşık ağ etkileşimi gerektirir. Özellikle büyük ölçekli servislerde bu işlem, gecikmelerin birikmesine ve sistem performansının düşmesine neden olabilir. Go 1.27 sürümüyle birlikte sunulan HTTP/1 bağlantısı yeniden kullanım optimasyonları, bu durumu önemli ölçüde düzeltiyor. Peki bu değişiklik, neden büyük ölçekli uygulamalarda gecikmeyi bu kadar etkili bir şekilde azaltıyor?

HTTP Bağlantısı Kurulumunun Maliyeti

HTTP isteği yaparken ilk adım, sunucuyla bir bağlantı kurmaktır. Bu bağlantı, TCP ve genellikle TLS üzerinden sağlanır. Her yeni bağlantı kurulumu, birkaç adımdan oluşur:

  • TCP El Sıkışması (1 RTT): İstemci SYN paketini gönderir, sunucu SYN-ACK ile yanıt verir, ardından istemci ACK gönderir. Bu işlem, bir tur (RTT) süresini alır.
  • TLS El Sıkışması (2 RTT): Güvenli bir bağlantı kurulması için, istemci ve sunucu arasında şifreleme anahtarları paylaşılır. Bu süreç, TLS 1.2 ile 2 RTT süresini alır.
  • HTTP İsteği: Şifreleme kurulduktan sonra, HTTP isteği gönderilir ve bu da bir tur daha gerektirir.

Toplamda, yeni bir bağlantı kurulması, 3 RTT (Round-Trip Time) süresini alır. Özellikle küresel dağıtım yapmış servislerde, bu gecikme 50 ms'yi geçebilir. Bu nedenle, her istek için yeni bir bağlantı kurmak hem zaman hem de kaynak tüketir.

Bağlantı Yeniden Kullanımı: Performansın Anahtar Faktörü

HTTP istemcileri ve sunucular, bu yüksek maliyeti azaltmak için bağlantı yeniden kullanımını kullanır. HTTP/1.1'de bağlantılar varsayılan olarak kalıcıdır ve birden fazla istek için kullanılabilir. Ancak bu yeniden kullanım, bazı durumlarda başarısız olabilir.

Go 1.26 sürümünde, bir HTTP isteği yaparken yalnızca durum kodunu almak isteniyorsa ve resp.Body okunmadan kapatılıyorsa, net/http paketi bu bağlantının yeniden kullanılmasını engeller. Çünkü Body okunmadan kapatıldığı için, paket, bir sonraki istek için bu bağlantının kullanılabilir olduğunu düşünmez. Bu durumda, her istek için yeni bir bağlantı kurulması gerekir.

Go 1.27'de Oluşan Değişiklikler

Go 1.27, bu sorunu çözmek için net/http paketinde önemli bir optimasyon yapmıştır. Artık Body okunmadan kapatılsa bile, sistem bağlantı yeniden kullanımını daha akıllıca yönetir. Bu sayede, bir bağlantı, bir sonraki istek için hemen kullanılabilir hale gelir. Bu değişiklik, özellikle büyük ölçekli uygulamalarda, çok sayıda HTTP isteği yapılan durumlarda çok büyük bir performans kazancı sağlar.

Neden Büyük Ölçekli Servislerde Bu Farklılık Daha Belirgin?

Büyük ölçekli servislerde, çok sayıda kullanıcı aynı anda istek gönderir. Her isteğin yeni bir bağlantı kurması, sistemde birikimli gecikmelerle sonuçlanır. Go 1.27'de yapılan bu optimasyon, her istek için yeni bir bağlantı kurulmasını engeller. Bu sayede, sistem daha hızlı ve verimli hale gelir.

Kullanıcı Kodunda Görünen Fark

Kullanıcıların yazdığı kodda, hiçbir değişiklik yapmaları gerekmez. Yalnızca Go 1.27'yi kullanmak yeterlidir. Bu, hem geliştiricilerin hem de sistem yöneticilerinin işini kolaylaştırır. Ayrıca, bu değişiklik, yalnızca yeni bir sürümle birlikte gerçekleştiği için, eski uygulamaların bile performans kazanmasını sağlar.

Sonuç

Go 1.27, HTTP/1 bağlantı yeniden kullanımını daha akıllı hale getirerek, büyük ölçekli servislerde gecikmeyi önemli ölçüde azaltmaktadır. Bu optimasyon, kullanıcıların kodunda herhangi bir değişiklik yapmadan, sistem performansını artırır. Ayrıca, bu değişiklik, hem geliştiriciler hem de kullanıcılar için daha hızlı ve verimli bir sistem sağlar. Go 1.27, bu değişiklikle birlikte, web uygulamalarının performansını önemli ölçüde geliştirmiştir.