mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-02-28 05:02:59 +00:00
refactor: simplify WebSocket message handling by removing batching and ensuring individual message delivery
This commit is contained in:
parent
1d732606f3
commit
28aa2d0a0c
1 changed files with 3 additions and 46 deletions
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Reference in a new issue