I motori server IOCP (Windows) ed EPOLL (Linux) di sgcWebSockets gestiscono migliaia di connessioni con un piccolo pool di thread invece di un thread per connessione, il che li rende la scelta giusta per i server sottoposti a un carico concorrente elevato. Finora, però, non avevano modo di accorgersi di un peer che ammutolisce senza salutare. Due nuove opzioni, TCPKeepAlive e KeepAliveTimeout, colmano questa lacuna.
Un Peer Silenzioso Non Genera Mai un Evento
IOCP ed EPOLL sono event-driven: il motore resta in attesa finché il sistema operativo non gli comunica che un socket ha dati, si è chiuso o ha generato un errore. Questo funziona bene fino a quando un peer non scompare senza inviare un FIN o un RST pulito, per esempio un client che va in crash, un NAT o un firewall che elimina un mapping inattivo, o una route che cambia silenziosamente. Per quel socket non arriva mai alcun evento, quindi la connessione resta ESTABLISHED sul server a tempo indeterminato.
Il classico IOHandler thread-per-connessione non ha questo problema, perché ogni connessione si blocca su una lettura con un timeout, quindi una connessione silenziosa viene rilevata e liberata la prossima volta che quella lettura va in timeout. IOCP ed EPOLL non avevano un meccanismo equivalente, ed è esattamente ciò che queste due nuove opzioni aggiungono.
TCPKeepAlive: Lascia che sia il Sistema Operativo a Osservare
Abilita TCPKeepAlive e sarà il sistema operativo stesso a iniziare a sondare una connessione una volta che è rimasta inattiva per Time secondi, ripetendo ogni Interval secondi finché il peer non risponde o la connessione non viene interrotta. È disattivato per impostazione predefinita; i valori seguenti corrispondono ai default quando è abilitato.
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
Su un server Windows, le stesse tre proprietà si trovano sotto IOHandlerOptions.IOCP.TCPKeepAlive.
KeepAliveTimeout: un Timeout di Inattività a Livello Applicativo
KeepAliveTimeout adotta un approccio diverso, più diretto: chiude qualsiasi connessione rimasta inattiva più a lungo del numero di secondi indicato, indipendentemente da ciò che decidono i probe di keepalive del sistema operativo. È l'equivalente più vicino al modo in cui l'IOHandler thread-per-connessione già libera una connessione silenziosa, è disabilitato per impostazione predefinita (un valore di 0), e vengono interessate solo le connessioni realmente inattive: una richiesta in fase di lettura o una risposta in fase di scrittura non viene mai interrotta da questa opzione.
Server.IOHandlerOptions.EPOLL.KeepAliveTimeout := 120; // seconds
// Windows
Server.IOHandlerOptions.IOCP.KeepAliveTimeout := 120;
Impostalo a un valore comodamente superiore alla tua richiesta o risposta più lenta prevista, per esempio 120 secondi per un tipico server HTTP o WebSocket, così le connessioni davvero morte vengono ripulite rapidamente senza mai toccare una che è semplicemente lenta.
Un Terzo Modo per Rilevare una Disconnessione
sgcWebSockets offriva già due modi per accorgersi che un peer è scomparso: abilitare CleanDisconnect su TsgcWebSocketClient, in modo che un client ben educato avvisi il server prima di andarsene, oppure eseguire un heartbeat lato server che esegue il ping di ogni client a intervalli regolari. Entrambi dipendono dalla collaborazione, del client nel primo caso, del tuo stesso ciclo ping/pong nel secondo. TCPKeepAlive e KeepAliveTimeout sono la prima opzione che non necessita di nulla di tutto ciò: il server rileva una connessione morta interamente da solo.
Disponibilità
Entrambe le opzioni sono disponibili da subito in sgcWebSockets per Delphi e C++ Builder dalla versione 7 alla 13, sotto IOHandlerOptions.EPOLL e IOHandlerOptions.IOCP, accanto alle impostazioni già esistenti EPOLLThreads, IOCPThreads e WorkOpThreads. Sono disattivate per impostazione predefinita, quindi nulla cambia per i server esistenti a meno che tu non le attivi.
Scarica la versione di prova e leggi il riferimento completo su IOCP ed EPOLL sulla pagina del prodotto sgcWebSockets.
Domande o commenti? Mettiti in contatto, riceverai una risposta dalle persone che hanno scritto il codice.
