Perché una connessione tramite WebSocket viene chiusa dopo 60 secondi?

Virtual Private Cloud Infrastruttura classica

Il tuo servizio Ingress espone un'applicazione che utilizza un WebSocket. Tuttavia, la connessione tra un client e la tua applicazione WebSocket viene chiusa quando non viene inviato traffico tra di essi per 60 secondi.

La connessione alla tua applicazione WebSocket potrebbe essere interrotta dopo 60 secondi di inattività per uno dei seguenti motivi:

  • La tua connessione Internet ha un proxy o un firewall che non tollerano lunghe connessioni.
  • Un timeout nell'ALB all'applicazione WebSocket termina la connessione.

Per evitare che la connessione venga chiusa dopo 60 secondi di inattività:

  1. Se stabilisci una connessione alla tua applicazione WebSocket tramite un proxy o un firewall, assicurati che il proxy o il firewall non siano configurati per terminare automaticamente le connessioni lunghe.

  2. Per mantenere attiva la connessione, puoi aumentare il valore del timeout oppure configurare un heartbeat nella tua applicazione.

    • Modificare il timeout: Aumentare il valore di proxy-read-timeout nella configurazione ALB. Per esempio, per cambiare il timeout da 60s a un valore maggiore come 300s, aggiungere questa annotazione al file di risorse Ingress: nginx.ingress.kubernetes.io/proxy-read-timeout: 300. Il timeout viene modificato per tutti gli ALB pubblici nel tuo cluster.
    • Impostare un heartbeat: se non si vuole modificare il valore di timeout di lettura predefinito dell'ALB, impostare un heartbeat nell'applicazione WebSocket. Quando si imposta un protocollo heartbeat utilizzando un framework come WAMP, il server upstream dell'app invia periodicamente un messaggio ping a un intervallo di tempo prestabilito e il client risponde con un messaggio pong. Impostare l'intervallo di heartbeat a 58 secondi o meno, in modo che il traffico di ping/pong mantenga aperta la connessione prima che venga applicato il timeout di 60 secondi.