在Go服务器中使用go例程

时间:2015-11-20 15:58:33

标签: go concurrency httpserver

我需要在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)
  }
 }
}

0 个答案:

没有答案