Я пытаюсь проверить, как golang может справляться с большими нагрузками, чтобы сравнить его с нашими текущими приложениями, созданными на Java.
Что я сделал, так это простой сервис эхо-отдыха (я добавляю только важные части своего кода):
// Return default message for root routing
func Index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}
// Main function
func main() {
router := mux.NewRouter() //.StrictSlash(true)
router.HandleFunc("/", Index).Methods("GET")
router.HandleFunc("/echo/{message}", echoHandler(calledServiceURL)).Methods("GET")
log.Println("Running server....")
log.Fatal(http.ListenAndServe(port, router))
}
Я провел тест с использованием инструмента ab, и он хорошо работал с -c 500 -n 500, но когда я попытался провести тест с такой большой нагрузкой, как это
ab -c 500 -n 50000 http://localhost:9596/echo/javier
Процесс работает хорошо в течение пары секунд, но затем кажется, что он закрывает соединение TCP, когда я получаю следующую ошибку:
Benchmarking localhost (be patient)
apr_socket_recv: Connection reset by peer (54)
Total of 501 requests completed
Это связано с ограничениями ОС, которых достиг мой тест, или это предел, который может обрабатывать мое приложение golang?
Есть ли лучший способ обрабатывать запросы, а затем избегать программы для закрытия соединений? (очереди запросов или что-то в этом роде).
Заранее спасибо
J