HTTP/2 Server Threads

· Özellikler

sgcWebSockets 2024.2.0 sürümünden itibaren HTTP/2 sunucusu, HTTP/2 isteklerini alırken iyileştirildi. Artık varsayılan olarak, sunucu yeni bir HTTP/2 isteği aldığında, bu istek kuyruğa alınır ve İş Parçacığı Havuzundaki iş parçacıklarından biri tarafından gönderilir. Bu, aynı bağlantı kullanılarak birden fazla istek gönderildiğinde ve bunlar sırayla işlendiğinde ortaya çıkan sorunu önler.

HTTP 1.1 ve HTTP 2.0 arasındaki farkları aşağıda görün:

HTTP 1.1

 Geleneksel HTTP davranışında, aynı bağlantı üzerinden birden fazla istek yapılırken, istemci bir sonraki isteği göndermeden önce her isteğin yanıtını beklemek zorundadır. Bu sıralı yaklaşım, bir web sitesinin kaynaklarının yükleme süresini önemli ölçüde artırır. Bu sorunu çözmek için HTTP/1.1, bir istemcinin sunucunun yanıtlarını beklemeden birden fazla istek göndermesine olanak tanıyan pipelining adlı bir özellik sundu. Sunucu da istemciye, istekleri aldığı sırayla yanıt verir.

pipelining bir çözüm gibi görünse de zorluklarla karşılaştı:


HTTP/1.1'i destekleyen sunuculardan sayfa yüklemeyi optimize etmek için Web Tarayıcıları bir geçici çözüm uyguladı. Sunucuya altı-sekiz paralel bağlantı açarak birden fazla isteğin eşzamanlı iletimini mümkün kılar. Bu paralellik, pipelining ile ilişkili sorunları azaltmayı ve genel sayfa yükleme sürelerini iyileştirmeyi amaçlar.

Web Tarayıcılarının altı-sekiz paralel bağlantı seçimi optimizasyon değerlendirmelerine dayanır. Bu sayıyı seçmenin ardındaki belirli nedenler; kaynak kullanımı, ağ verimliliği ve olası darboğazlardan kaçınma arasında bir denge içerebilir. 

HTTP 2.0

pipelining'de karşılaşılan kısıtlamalara yanıt olarak, HTTP/2 multiplexing adlı bir özellik sundu. Multiplexing, birden fazla isteğin ve yanıtın tek bir bağlantı üzerinden eşzamanlı iletimini mümkün kılarak istemci ve sunucu arasında daha verimli iletişime olanak tanır.

HTTP/2, ikili (binary) çerçeveleme mekanizması kullanır; bu, HTTP mesajlarının çerçeve adı verilen daha küçük, bağımsız birimlere bölündüğü anlamına gelir. Bu çerçeveler iç içe geçirilebilir ve bağlantı üzerinden birbirinden bağımsız olarak gönderilebilir. Alıcı uçta, orijinal HTTP mesajını yeniden oluşturmak için çerçeveler yeniden birleştirilir.

Bu ikili çerçeveleme mekanizması, HTTP/2'de multiplexing'i sağlamak için temeldir. Tarayıcının, engelleme sorunlarıyla karşılaşmadan aynı bağlantı üzerinden birden fazla istek göndermesine olanak tanır. Sonuç olarak, Chrome gibi tarayıcılar HTTP/2 istekleri için aynı bağlantı kimliğini kullanır; bu da istemci ile sunucu arasında verimli ve kesintisiz iletişime olanak tanır.

Özünde, ikili çerçeveleme mekanizmasıyla sağlanan HTTP/2'nin multiplexing özelliği, birden fazla istek ve yanıtın tek bir bağlantı üzerinden eşzamanlı iletimini kolaylaştırarak istemciler ve sunucular arasındaki veri alışverişinin verimliliğini ve hızını artırır.

TsgcWebSocketHTTPServer Bileşeni

HTTP/2 protokolünün performansını iyileştirmek için, sunucu yeni bir HTTP/2 isteği aldığında istekler varsayılan olarak bir İş Parçacığı Havuzunda (varsayılan 32) gönderilir; bu, bu iş parçacığı havuzunun yokluğunda (bağlantı iş parçacığı bağlamında) sırayla işlenmesi gerekecek olan çok sayıda eşzamanlı isteği tek bir bağlantı gönderdiğinde beklemeleri önler.

PoolOfThreads'in davranışı aşağıdaki özelliklerde yapılandırılabilir.


İstekleri ince ayarlamak, hangilerinin İş Parçacığı Havuzunda işlenmesi gerektiğini (zaman aldıkları için) seçerken diğerlerinin bağlantı iş parçacığında işlenebilmesini sağlamak için OnHttp2BeforeAsyncRequest olayını kullanabilirsiniz; bu olay, istek iş parçacığı havuzuna kuyruğa alınmadan önce tetiklenir, isteğin iş parçacığında çalışıp çalışmayacağını ayarlamak için Async parametresini kullanın.
procedure OnHTTP2BeforeAsyncRequest(Sender: TObject; Connection: TsgcWSConnection; const ARequestInfo: TIdHTTPRequestInfo; var Async: Boolean);
begin
  if ARequestInfo.Document = '/time-consuming-request' then
    ASync := False;
end;