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

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

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

【问题讨论】:

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

标签: multithreading go concurrency goroutine mux


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2012-03-18
    • 2019-03-30
    • 2021-05-30
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多