refactor: simplify WebSocket message handling by removing batching and ensuring individual message delivery

This commit is contained in:
lolka1333 2025-12-14 12:20:02 +01:00
parent 1d732606f3
commit 28aa2d0a0c

View file

@ -171,55 +171,12 @@ func (w *WebSocketController) writePump(client *websocket.Client, conn *ws.Conn)
return
}
writer, err := conn.NextWriter(ws.TextMessage)
if err != nil {
// Send each message individually (no batching)
// This ensures each JSON message is sent separately and can be parsed correctly
if err := conn.WriteMessage(ws.TextMessage, message); err != nil {
logger.Debugf("WebSocket write error for client %s: %v", client.ID, err)
return
}
writer.Write(message)
// Optimization: message batching with smart limit
// Process accumulated messages but limit to prevent delays
n := len(client.Send)
maxQueued := 20 // Increased from 10 to 20 for better throughput
if n > maxQueued {
// Skip old messages, keep only the latest for relevance
skipped := n - maxQueued
for i := 0; i < skipped; i++ {
select {
case <-client.Send:
// Skip old message
default:
// Channel closed or empty, stop skipping
goto skipDone
}
}
skipDone:
n = len(client.Send) // Update count after skipping
}
// Batching: send multiple messages in one frame
// Safe reading with channel close check
for i := 0; i < n; i++ {
select {
case msg, ok := <-client.Send:
if !ok {
// Channel closed, exit
return
}
writer.Write([]byte{'\n'})
writer.Write(msg)
default:
// No more messages in queue, stop batching
goto batchDone
}
}
batchDone:
if err := writer.Close(); err != nil {
logger.Debugf("WebSocket writer close error for client %s: %v", client.ID, err)
return
}
case <-ticker.C:
conn.SetWriteDeadline(time.Now().Add(writeWait))