fix: harden high-fanout delivery under load
This commit is contained in:
+19
-5
@@ -70,14 +70,23 @@ func (sess *Session) readLoop() {
|
||||
}()
|
||||
|
||||
sess.ws.SetReadLimit(globals.maxMessageSize)
|
||||
sess.ws.SetReadDeadline(time.Now().Add(pongWait))
|
||||
sess.ws.SetPongHandler(func(string) error {
|
||||
refreshReadDeadline := func(event, presenceSource string) {
|
||||
atomic.StoreInt64(&sess.lastAction, types.TimeNow().UnixNano())
|
||||
immetrics.IncWSHeartbeat("pong_received")
|
||||
sess.refreshPresence("ws.pong")
|
||||
sess.ws.SetReadDeadline(time.Now().Add(pongWait))
|
||||
immetrics.IncWSHeartbeat(event)
|
||||
if presenceSource != "" {
|
||||
sess.refreshPresence(presenceSource)
|
||||
}
|
||||
_ = sess.ws.SetReadDeadline(time.Now().Add(pongWait))
|
||||
}
|
||||
_ = sess.ws.SetReadDeadline(time.Now().Add(pongWait))
|
||||
sess.ws.SetPongHandler(func(string) error {
|
||||
refreshReadDeadline("pong_received", "ws.pong")
|
||||
return nil
|
||||
})
|
||||
sess.ws.SetPingHandler(func(appData string) error {
|
||||
refreshReadDeadline("ping_received", "")
|
||||
return sess.ws.WriteControl(websocket.PongMessage, []byte(appData), time.Now().Add(writeWait))
|
||||
})
|
||||
|
||||
for {
|
||||
// Read a ClientComMessage
|
||||
@@ -90,6 +99,11 @@ func (sess *Session) readLoop() {
|
||||
}
|
||||
return
|
||||
}
|
||||
// Any successfully read client frame proves that the connection is alive.
|
||||
// This prevents a busy client from timing out merely because its Pong was
|
||||
// delayed behind application traffic.
|
||||
atomic.StoreInt64(&sess.lastAction, types.TimeNow().UnixNano())
|
||||
_ = sess.ws.SetReadDeadline(time.Now().Add(pongWait))
|
||||
statsInc("IncomingMessagesWebsockTotal", 1)
|
||||
sess.dispatchRaw(raw)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user