mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-12-23 06:42:41 +00:00
refactor: translate comments to English
This commit is contained in:
parent
71ff84a24d
commit
6247e79ac3
3 changed files with 30 additions and 30 deletions
BIN
web.rar
BIN
web.rar
Binary file not shown.
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue