为了账号安全,请及时绑定邮箱和手机立即绑定

如何读取请求 JSON 正文,以便在响应请求后可以使用它?

如何读取请求 JSON 正文,以便在响应请求后可以使用它?

Go
慕的地10843 2023-07-04 10:03:54
我正在编写一个 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 区域,更靠近数据源,往返时间下降到之前的五分之一。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

看起来您无法更快地读取正文,特别是如果您已经尝试过只执行 aioutil.ReadAll(r.Body)而不是对其进行解码。

由于从您观察到的大多数请求确实很快,因此您的问题可能不是该handleData功能。

这里有一些可以尝试的事情:

  • 使用不同的“max_workers”设置

如果挂起的请求量太大,即使 goroutine 很便宜,它们也会占用一些内存,因此您的服务器可能会变慢,特别是如果垃圾收集在那里发挥作用,这将我们带到下一个项目符号。

  • 尝试分析 GC,或者使用不同的设置

  • 水平缩放

您没有描述您的整个设置,但可能您有一组服务器负载平衡?如果容量很大,一种可能是您拥有的服务器数量无法处理负载,在这种情况下,您可以尝试添加更多服务器。


查看完整回答
反对 回复 2023-07-04
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信