Files
wonderwall/pkg/server/server.go
Trong Huu Nguyen b28c91c94c perf(all): use single Transport, set IdleConnTimeout
Reduces IdleConnTimeout to 5 seconds. Reverse proxying to a server that
has a shorter keep-alive may cause "EOF" and "connection reset by peer"
issues as the connections may be closed by the upstream before our
client notices.
2023-05-16 08:36:45 +02:00

74 lines
1.3 KiB
Go

package server
import (
"context"
"net/http"
"os"
"os/signal"
"sync"
"syscall"
"time"
"github.com/go-chi/chi/v5"
log "github.com/sirupsen/logrus"
"github.com/nais/wonderwall/pkg/config"
)
var (
defaultTransport *http.Transport
once sync.Once
)
func DefaultTransport() *http.Transport {
once.Do(func() {
t := http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConns = 200
t.MaxIdleConnsPerHost = 100
t.IdleConnTimeout = 5 * time.Second
defaultTransport = t
})
return defaultTransport
}
func Start(cfg *config.Config, r chi.Router) error {
server := http.Server{
Addr: cfg.BindAddress,
Handler: r,
}
serverCtx, serverStopCtx := context.WithCancel(context.Background())
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
go func() {
<-sig
shutdownCtx, shutdownStopCtx := context.WithTimeout(serverCtx, 20*time.Second)
go func() {
<-shutdownCtx.Done()
if shutdownCtx.Err() == context.DeadlineExceeded {
log.Fatal("graceful shutdown timed out.. forcing exit.")
}
}()
err := server.Shutdown(shutdownCtx)
if err != nil {
log.Fatal(err)
}
shutdownStopCtx()
serverStopCtx()
}()
err := server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
return err
}
<-serverCtx.Done()
return nil
}