我需要在Go中编写一个简单的Web服务器。它接受请求,将请求映射到avro对象并将其发送到Kafka。要求是它立即回答以保持用户的低延迟。映射到avro对象并发送到Kafka可以异步发生。我提出了以下设计,但我想知道它是否以预期的方式使用Go结构,或者是否可以使用通道进行优化。我省略了私有方法和初始化结构。问题是服务器每秒最多可处理10500个请求,然后响应时间会急剧增加。所以我想知道是否有办法优化它。
func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) // not needed in Go 1.5.0
server := &Server{
Producer: newProducer(brokerList),
}
defer func() {
if err := server.Close(); err != nil {
Error.Println("Failed to close server", err)
}
}()
Error.Fatal(server.Run(*addr))
}
func (s *Server) Run(addr string) error {
httpServer := &http.Server{
Addr: addr,
Handler: s.Handler(),
}
return httpServer.ListenAndServe()
}
func (s *Server) Handler() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
req, err := ParseRequest(r.Body)
if err != nil {
Warning.Println("Failed to parse request", err.Error())
} else {
go handleRequest(s, req)
}
w.WriteHeader(204) // respond with 'no bid'
)
}
func handleRequest(s *Server, req *openrtb.BidRequest) {
req.Validate()
var avroObject, err = createAvro(req)
if err != nil {
Warning.Printf(err.Error())
}
if avroObject != nil {
sendToKafka(avroObject, s)
}
}
}