在 go 中一次处理多个 GET 请求

Posted

技术标签:

【中文标题】在 go 中一次处理多个 GET 请求【英文标题】:Handling many GET requests at once in go 【发布时间】:2018-03-02 16:56:14 【问题描述】:

我正在编写这个 API,它是 slack bot 应用程序的后端,许多用户都会使用它。在我的 api 中的一个 API 端点中,我正在调用一个外部 API 来获取一些数据,以便我可以在我的 API 中对其进行按摩以将其发送给 BOT/用户。但是我正在进行的外部 API 调用非常昂贵(~5 / ~10 秒)。我注意到,当我同时访问我的 API 端点两次或更多次时,有时我没有得到任何数据。只有一个调用成功。有什么办法可以解决这个问题吗?我一直在研究工作队列,但不确定它是否为此矫枉过正。

我正在使用多路复用器进行路由。

【问题讨论】:

所有请求已经在单独的 go 例程中同时处理。因此,无论您遇到什么问题,都不是因为缺乏并发性。不过,如果没有看到您的代码,就很难猜出问题所在。 确保您在 http 请求的整个生命周期中都没有持有互斥锁。有时,人们这样做会有效地将您的并发性限制在一个 goroutine 上。 哪些请求失败了?来自机器人的请求,还是您对第三方 API 的请求? 【参考方案1】:

如果您想比外部 API 更快地处理请求,则需要将出站调用与传入请求分开,并进行某种缓存。例如,您可以:

运行一个调用外部 API 并将结果存储在缓存中的工作器 您是否请求从缓存中提取处理程序 如果数据是最新的,则返回它 如果数据太旧,等待缓存刷新,使用新数据

如果这是一个 24/7 繁忙的服务,worker 可以按照任何必要的频率重复刷新缓存;或者,您可以让请求处理程序将一条消息排队到缓存工作人员,表明缓存需要刷新,这样当您没有收到请求时,它就不会继续访问外部 API。

【讨论】:

以上是关于在 go 中一次处理多个 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中一次提交中执行多个 save() 的最佳方法

在Django中一次提交中执行多个save()的最佳方法

如何在 Firestore 中一次创建/更新多个文档

Go语言 Gin处理请求参数

Go语言 Gin处理请求参数

go中处理各种请求方式以及处理接口请求参数