}
func serveTCP(listener *net.TCPListener) {
+ // connection rate limiter
+ rate := 5
+ burst := 50
+ interval := time.Second / time.Duration(rate)
+ tick := time.NewTicker(interval)
+ defer tick.Stop()
+ throttle := make(chan time.Time, burst)
+ go func() {
+ for t := range tick.C {
+ select {
+ case throttle <- t:
+ default:
+ }
+ }
+ }()
+ // worker and job queue setup
+ nworker := 5
+ njobs := 50
+ jobs := make(chan net.Conn, njobs)
+ for w := 1; w <= nworker; w++ {
+ go func(id int, jobs <-chan net.Conn) {
+ for j := range jobs {
+ tracer.Print("worker id ", id, ": ", j.RemoteAddr())
+ handleRequest(j)
+ }
+ }(w, jobs)
+ }
+ // accept connections
defer listener.Close()
logger.Print("listening on TCP ", listener.Addr())
for {
}
if checkFatal(err, "Accept") == nil {
logger.Print("connect from ", conn.RemoteAddr())
- go handleRequest(conn)
+ jobs <- conn
}
+ <-throttle
}
}