@ilitaexperta

Как правильно сделать long polling на go?

Хочу сделать long polling метод в своей api на golang. Как правильно это сделать?

Сейчас реализовал так:
func longPollingHandler(w http.ResponseWriter, r *http.Request) {
	done := make(chan struct{})

	go checkUpdates(done)

	select {
	case <- done:
		makeAnswer(w)
	case <- time.After(20 * time.Second):
		makeAnswer(w)
	}
}

func checkUpdates(done chan<- struct{}) {
	for i := 0; i < 20; i++ {
		
		// Тут проверяю есть ли изменения в базе
		// ...

		if db.HasChanges() {
			break;
		}

		time.Sleep(time.Second)
	}

	done <- struct{}{}
}

func makeAnswer(w http.ResponseWriter) {
	// Тут шлю ответ клиенту
	// ...
}

http.HandleFunc("/api/long_polling", longPollingHandler)


Все работает, но появилось ощущение что ответы на другие методы апи(не лонг поллинг) стали приходить с задержкой. Подозреваю что это изза слипа в горутине.

Как в итоге правильно сделать? Пожалуйста не предлагаейте навешать 10 фреймворков, библиотек и зависимостей.
  • Вопрос задан
  • 1598 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы