我正在编写一个 HTTP 服务器来处理 Cisco Meraki 扫描 API。它是一个推送 API,思科会定期使用 POST 请求和 JSON 正文调用您的端点。API 必须能够在 500 毫秒内响应此 POST 请求。否则,思科将停止向您发送数据,并且您无法恢复该信息。
因此,我一直在寻找尽快处理这些请求的方法。
我做的第一件事是使用队列解耦 JSON 正文的处理。我从请求中取出正文,将其放入队列中,然后响应。然后,几个worker将处理body并将其异步存储在S3上。我还尝试使服务器尽可能简单。
大多数请求的处理时间少于 500 毫秒,但有些请求则不然。看看我现在的情况,唯一想到的改进就是更快地处理请求正文。
整个服务器可通过以下链接获取:meraki_endpoint.go。这就是我目前处理请求正文的方式:
func handleData(w http.ResponseWriter, r *http.Request, jobs chan job) {
var devicesSeen DevicesSeen
// I am using "github.com/json-iterator/go" instead of "encoding/json"
err := json.NewDecoder(r.Body).Decode(&devicesSeen)
if err != nil {
http.Error(w, "Bad request - Can't Decode!", 400)
panic(err)
}
// Create Job and push the work into the Job Channel
go func() {
jobs <- job{devicesSeen}
}()
// Render success
w.WriteHeader(http.StatusAccepted)
}
目前,我正在解码 JSON,因为我从正文中读取 if,而不是使用 读取它并将其存储为字节列表ioutil.ReadAll(r.Body)。尝试了这两种方法后,我找不到显着的速度提升。
如何提高服务器的性能?或者,如何更快地读取请求正文,以便稍后在队列中处理它?
编辑#1
我将堆栈移至另一个 AWS 区域,更靠近数据源,往返时间下降到之前的五分之一。
明月笑刀无情
相关分类