tioffs
@tioffs

Go socket дикие тормоза 5 коннектов как так?

Вообщем сокет каждую секунду запускает команду в ларавел но она отрабатывает моментально меньше 300мс
Получает данные из memcache и пушит их в каналы.
Сервер VDS 4gb оперативы 2 ядра не может же он глючить из за 5 коннектов как так то
var upgrader = websocket.Upgrader{
	CheckOrigin:     func(r *http.Request) bool { return true },
	ReadBufferSize:  8192,
	WriteBufferSize: 8192,
}
var clients = make(map[*websocket.Conn]bool)
var mc = memcache.New("127.0.0.1:11211")

func echoHandler(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		return
	}
	clients[conn] = true
	mapD := map[string]interface{}{"user": len(clients)}
	mapB, _ := json.Marshal(mapD)
	for {
		for client := range clients {
			ErrorSendOnline := client.WriteMessage(1, mapB)
			if ErrorSendOnline != nil {
				client.Close()
				delete(clients, client)
			}

		}
		messageType, p, err := conn.ReadMessage()
		if err != nil {
			return
		}
		err = conn.WriteMessage(messageType, p)
		if err != nil {
			return
		}

	}
}

func getCache() {
	c := time.Tick(1000 * time.Millisecond)
	for range c {

		exec.Command("php", "/var/www/elrush/artisan", "commandMe").Run()
	}
}
func getData() {
	c := time.Tick(1000 * time.Millisecond)
	for range c {
		if len(clients) > 0 {
			val, errorMc := mc.Get("tem")
			for client := range clients {
				if errorMc == nil {
					errorSendCache := client.WriteMessage(1, val.Value)
					if errorSendCache != nil {
						client.Close()
						delete(clients, client)
					}
					mapD := map[string]interface{}{"user": len(clients)}
					mapB, _ := json.Marshal(mapD)
					ErrorSendOnline := client.WriteMessage(1, mapB)
					if ErrorSendOnline != nil {
						client.Close()
						delete(clients, client)
					}
				}
			}

			if errorMc == nil {
				mc.Delete("item")
			}

		}
}

func main() {
	http.HandleFunc("/", echoHandler)
       go getCache() //горутина
       go getData() //горутина
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic("Error: " + err.Error())
	}
}
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
tioffs
@tioffs Автор вопроса
Вопрос решен, все тормоза из за memcached он очень плохо справляется с автоматическим удалением ключей через N время, если использовать просто обновление ключей то все нормально.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы