refactor: translate comments to English

This commit is contained in:
lolka1333 2025-12-14 10:48:43 +01:00
parent 71ff84a24d
commit 6247e79ac3
3 changed files with 30 additions and 30 deletions

BIN
web.rar

Binary file not shown.

View file

@ -30,8 +30,8 @@ const (
) )
var upgrader = ws.Upgrader{ var upgrader = ws.Upgrader{
ReadBufferSize: 4096, // Увеличено с 1024 для лучшей производительности ReadBufferSize: 4096, // Increased from 1024 for better performance
WriteBufferSize: 4096, // Увеличено с 1024 для лучшей производительности WriteBufferSize: 4096, // Increased from 1024 for better performance
CheckOrigin: func(r *http.Request) bool { CheckOrigin: func(r *http.Request) bool {
// Check origin for security // Check origin for security
origin := r.Header.Get("Origin") origin := r.Header.Get("Origin")
@ -99,7 +99,7 @@ func (w *WebSocketController) HandleWebSocket(c *gin.Context) {
client := &websocket.Client{ client := &websocket.Client{
ID: clientID, ID: clientID,
Hub: w.hub, Hub: w.hub,
Send: make(chan []byte, 512), // Увеличено с 256 до 512 для предотвращения переполнения Send: make(chan []byte, 512), // Increased from 256 to 512 to prevent overflow
Topics: make(map[websocket.MessageType]bool), Topics: make(map[websocket.MessageType]bool),
} }
@ -178,39 +178,39 @@ func (w *WebSocketController) writePump(client *websocket.Client, conn *ws.Conn)
} }
writer.Write(message) writer.Write(message)
// Оптимизация: батчинг сообщений с умным ограничением // Optimization: message batching with smart limit
// Обрабатываем накопленные сообщения, но ограничиваем для предотвращения задержек // Process accumulated messages but limit to prevent delays
n := len(client.Send) n := len(client.Send)
maxQueued := 20 // Увеличено с 10 до 20 для лучшей пропускной способности maxQueued := 20 // Increased from 10 to 20 for better throughput
if n > maxQueued { if n > maxQueued {
// Пропускаем старые сообщения, оставляем только последние для актуальности // Skip old messages, keep only the latest for relevance
skipped := n - maxQueued skipped := n - maxQueued
for i := 0; i < skipped; i++ { for i := 0; i < skipped; i++ {
select { select {
case <-client.Send: case <-client.Send:
// Пропускаем старое сообщение // Skip old message
default: default:
// Канал закрыт или пуст, прекращаем пропуск // Channel closed or empty, stop skipping
goto skipDone goto skipDone
} }
} }
skipDone: skipDone:
n = len(client.Send) // Обновляем количество после пропуска 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++ { for i := 0; i < n; i++ {
select { select {
case msg, ok := <-client.Send: case msg, ok := <-client.Send:
if !ok { if !ok {
// Канал закрыт, выходим // Channel closed, exit
return return
} }
writer.Write([]byte{'\n'}) writer.Write([]byte{'\n'})
writer.Write(msg) writer.Write(msg)
default: default:
// Больше нет сообщений в очереди, прекращаем батчинг // No more messages in queue, stop batching
goto batchDone goto batchDone
} }
} }

View file

@ -78,9 +78,9 @@ func NewHub() *Hub {
return &Hub{ return &Hub{
clients: make(map[*Client]bool), clients: make(map[*Client]bool),
broadcast: make(chan []byte, 2048), // Увеличено с 256 до 2048 для высокой нагрузки broadcast: make(chan []byte, 2048), // Increased from 256 to 2048 for high load
register: make(chan *Client, 100), // Буферизованный канал для быстрой регистрации register: make(chan *Client, 100), // Buffered channel for fast registration
unregister: make(chan *Client, 100), // Буферизованный канал для быстрой отмены регистрации unregister: make(chan *Client, 100), // Buffered channel for fast unregistration
ctx: ctx, ctx: ctx,
cancel: cancel, cancel: cancel,
workerPoolSize: workerPoolSize, workerPoolSize: workerPoolSize,
@ -159,7 +159,7 @@ func (h *Hub) Run() {
if message == nil { if message == nil {
continue continue
} }
// Оптимизация: быстро копируем список клиентов и освобождаем блокировку // Optimization: quickly copy client list and release lock
h.mu.RLock() h.mu.RLock()
clientCount := len(h.clients) clientCount := len(h.clients)
if clientCount == 0 { if clientCount == 0 {
@ -167,26 +167,26 @@ func (h *Hub) Run() {
continue continue
} }
// Предварительно выделяем память для списка клиентов // Pre-allocate memory for client list
clients := make([]*Client, 0, clientCount) clients := make([]*Client, 0, clientCount)
for client := range h.clients { for client := range h.clients {
clients = append(clients, client) clients = append(clients, client)
} }
h.mu.RUnlock() h.mu.RUnlock()
// Параллельная рассылка с использованием worker pool // Parallel broadcast using worker pool
h.broadcastParallel(clients, message) h.broadcastParallel(clients, message)
} }
} }
} }
// broadcastParallel отправляет сообщение всем клиентам параллельно для максимальной производительности // broadcastParallel sends message to all clients in parallel for maximum performance
func (h *Hub) broadcastParallel(clients []*Client, message []byte) { func (h *Hub) broadcastParallel(clients []*Client, message []byte) {
if len(clients) == 0 { if len(clients) == 0 {
return return
} }
// Для небольшого количества клиентов используем простую параллельную отправку // For small number of clients, use simple parallel sending
if len(clients) < h.workerPoolSize { if len(clients) < h.workerPoolSize {
var wg sync.WaitGroup var wg sync.WaitGroup
for _, client := range clients { for _, client := range clients {
@ -195,7 +195,7 @@ func (h *Hub) broadcastParallel(clients []*Client, message []byte) {
defer wg.Done() defer wg.Done()
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
// Канал может быть закрыт, безопасно игнорируем // Channel may be closed, safely ignore
logger.Debugf("WebSocket broadcast panic recovered for client %s: %v", c.ID, r) logger.Debugf("WebSocket broadcast panic recovered for client %s: %v", c.ID, r)
} }
}() }()
@ -212,14 +212,14 @@ func (h *Hub) broadcastParallel(clients []*Client, message []byte) {
return return
} }
// Для большого количества клиентов используем worker pool для оптимальной производительности // For large number of clients, use worker pool for optimal performance
clientChan := make(chan *Client, len(clients)) clientChan := make(chan *Client, len(clients))
for _, client := range clients { for _, client := range clients {
clientChan <- client clientChan <- client
} }
close(clientChan) close(clientChan)
// Запускаем воркеров для параллельной обработки // Start workers for parallel processing
h.broadcastWg.Add(h.workerPoolSize) h.broadcastWg.Add(h.workerPoolSize)
for i := 0; i < h.workerPoolSize; i++ { for i := 0; i < h.workerPoolSize; i++ {
go func() { go func() {
@ -228,7 +228,7 @@ func (h *Hub) broadcastParallel(clients []*Client, message []byte) {
func() { func() {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
// Канал может быть закрыт, безопасно игнорируем // Channel may be closed, safely ignore
logger.Debugf("WebSocket broadcast panic recovered for client %s: %v", client.ID, r) logger.Debugf("WebSocket broadcast panic recovered for client %s: %v", client.ID, r)
} }
}() }()
@ -244,7 +244,7 @@ func (h *Hub) broadcastParallel(clients []*Client, message []byte) {
}() }()
} }
// Ждем завершения всех воркеров // Wait for all workers to finish
h.broadcastWg.Wait() h.broadcastWg.Wait()
} }
@ -277,7 +277,7 @@ func (h *Hub) Broadcast(messageType MessageType, payload interface{}) {
return return
} }
// Неблокирующая отправка с таймаутом для предотвращения задержек // Non-blocking send with timeout to prevent delays
select { select {
case h.broadcast <- data: case h.broadcast <- data:
case <-time.After(100 * time.Millisecond): case <-time.After(100 * time.Millisecond):
@ -317,7 +317,7 @@ func (h *Hub) BroadcastToTopic(messageType MessageType, payload interface{}) {
} }
h.mu.RLock() h.mu.RLock()
// Фильтруем клиентов по топикам и быстро освобождаем блокировку // Filter clients by topics and quickly release lock
subscribedClients := make([]*Client, 0) subscribedClients := make([]*Client, 0)
for client := range h.clients { for client := range h.clients {
if len(client.Topics) == 0 || client.Topics[messageType] { if len(client.Topics) == 0 || client.Topics[messageType] {
@ -326,7 +326,7 @@ func (h *Hub) BroadcastToTopic(messageType MessageType, payload interface{}) {
} }
h.mu.RUnlock() h.mu.RUnlock()
// Параллельная отправка подписанным клиентам // Parallel send to subscribed clients
if len(subscribedClients) > 0 { if len(subscribedClients) > 0 {
h.broadcastParallel(subscribedClients, data) h.broadcastParallel(subscribedClients, data)
} }