sgcWebSockets içindeki IOCP (Windows) ve EPOLL (Linux) sunucu motorları, bağlantı başına bir iş parçacığı yerine küçük bir iş parçacığı havuzuyla binlerce bağlantıyı yönetir; bu da onları yoğun eşzamanlı yük altındaki sunucular için doğru seçim yapar. Ancak şimdiye kadar, veda etmeden sessizleşen bir karşı tarafı fark etmenin bir yolu yoktu. İki yeni seçenek, TCPKeepAlive ve KeepAliveTimeout, bu boşluğu kapatıyor.
Sessiz Bir Karşı Taraf Hiçbir Zaman Olay Üretmez
IOCP ve EPOLL olay güdümlüdür: işletim sistemi bir soketin veri içerdiğini, kapandığını veya hata verdiğini bildirene kadar motor uyur. Bu, bir karşı taraf temiz bir FIN veya RST göndermeden ortadan kaybolana kadar iyi çalışır; örneğin çöken bir istemci, atıl bir eşlemeyi düşüren bir NAT veya güvenlik duvarı ya da sessizce değişen bir rota. O soket için hiçbir zaman bir olay gelmez, bu yüzden bağlantı sunucuda süresiz olarak ESTABLISHED durumunda kalır.
Klasik bağlantı başına iş parçacığı kullanan IOHandler bu sorunu yaşamaz, çünkü her bağlantı zaman aşımlı bir okuma üzerinde bloke olur, böylece sessiz bir bağlantı bir sonraki okuma zaman aşımına uğradığında fark edilip serbest bırakılır. IOCP ve EPOLL'un buna denk bir mekanizması yoktu; bu iki yeni seçeneğin eklediği tam olarak budur.
TCPKeepAlive: İzlemeyi İşletim Sistemine Bırakın
TCPKeepAlive'ı etkinleştirin, işletim sisteminin kendisi bir bağlantı Time saniye boyunca atıl kaldığında onu yoklamaya başlar ve karşı taraf yanıt verene ya da bağlantı düşürülene kadar bunu her Interval saniyede bir tekrarlar. Varsayılan olarak kapalıdır; aşağıdaki değerler, etkinleştirildiğinde kullanılan varsayılanlarla eşleşir.
Server.IOHandlerOptions.IOHandlerType := iohEPOLL;
Server.IOHandlerOptions.EPOLL.TCPKeepAlive.Enabled := True;
Server.IOHandlerOptions.EPOLL.TCPKeepAlive.Time := 60; // seconds idle before probing
Server.IOHandlerOptions.EPOLL.TCPKeepAlive.Interval := 10; // seconds between probes
Bir Windows sunucusunda, aynı üç özellik IOHandlerOptions.IOCP.TCPKeepAlive altında bulunur.
KeepAliveTimeout: Uygulama Düzeyinde Bir Atıl Kalma Zaman Aşımı
KeepAliveTimeout farklı, daha doğrudan bir yaklaşım izler: işletim sisteminin keepalive yoklamalarının ne karar verdiğinden bağımsız olarak, verilen saniye sayısından daha uzun süre atıl kalan her bağlantıyı kapatır. Bağlantı başına iş parçacığı kullanan IOHandler'ın sessiz bir bağlantıyı zaten nasıl serbest bıraktığına en yakın eşleşmedir, varsayılan olarak devre dışıdır (0 değeri) ve yalnızca gerçekten atıl olan bağlantılar etkilenir; okunmakta olan bir istek veya yazılmakta olan bir yanıt bundan asla kesintiye uğramaz.
Server.IOHandlerOptions.EPOLL.KeepAliveTimeout := 120; // seconds
// Windows
Server.IOHandlerOptions.IOCP.KeepAliveTimeout := 120;
Gerçekten ölü bağlantılar hızla temizlenirken sadece yavaş olan bir bağlantıya asla dokunulmaması için, değeri beklediğiniz en yavaş istek veya yanıtın rahatça üzerinde ayarlayın; tipik bir HTTP veya WebSocket sunucusu için örneğin 120 saniye.
Bağlantı Kesilmesini Algılamanın Üçüncü Bir Yolu
sgcWebSockets, bir karşı tarafın gittiğini fark etmenin zaten iki yolunu sunuyordu: iyi davranan bir istemcinin ayrılmadan önce sunucuya haber vermesi için TsgcWebSocketClient üzerinde CleanDisconnect'i etkinleştirmek veya her istemciyi belirli aralıklarla ping'leyen sunucu tarafı bir heartbeat çalıştırmak. İkisi de iş birliğine bağlıdır; birincisinde istemciden, ikincisinde kendi ping/pong gidiş-dönüşünüzden. TCPKeepAlive ve KeepAliveTimeout, bunların hiçbirine ihtiyaç duymayan ilk seçenektir: sunucu, ölü bir bağlantıyı tamamen kendi başına tespit eder.
Kullanılabilirlik
Her iki seçenek de artık Delphi ve C++ Builder 7'den 13'e kadar sgcWebSockets'te, mevcut EPOLLThreads, IOCPThreads ve WorkOpThreads ayarlarının yanı sıra IOHandlerOptions.EPOLL ve IOHandlerOptions.IOCP altında kullanılabilir. Varsayılan olarak kapalıdır, dolayısıyla siz açmadığınız sürece mevcut sunucular için hiçbir şey değişmez.
Deneme sürümünü indirin ve tam IOCP ve EPOLL referansını sgcWebSockets ürün sayfasında okuyun.
Sorularınız veya geri bildiriminiz mi var? Bize ulaşın, kodu yazan kişilerden bir yanıt alacaksınız.
