Ответ
Для ограничения количества одновременных вызовов обработчика в Go можно использовать semaphore или buffered channel.
Пример с буферизированным каналом:
var sem = make(chan struct{}, 10) // Макс 10 одновременных запросов
func handler(w http.ResponseWriter, r *http.Request) {
sem <- struct{}{} // Занять слот
defer func() { <-sem }() // Освободить слот
// Логика обработки
time.Sleep(1 * time.Second)
w.Write([]byte("OK"))
}
Или с sync.Semaphore (Go 1.21+):
var sem = semaphore.NewWeighted(10)
func handler(w http.ResponseWriter, r *http.Request) {
if err := sem.Acquire(r.Context(), 1); err != nil {
return
}
defer sem.Release(1)
// Логика обработки
}
Оба варианта ограничивают конкурентные вызовы без сторонних библиотек.