Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在go中同时处理多个GET请求_Multithreading_Go_Concurrency_Goroutine_Mux - Fatal编程技术网

Multithreading 在go中同时处理多个GET请求

Multithreading 在go中同时处理多个GET请求,multithreading,go,concurrency,goroutine,mux,Multithreading,Go,Concurrency,Goroutine,Mux,我正在编写这个API,它是slack bot应用程序的后端,将被许多用户使用。在我的API中的一个API端点中,我调用一个外部API来获取一些数据,这样我就可以在我的API中对其进行处理,将其发送给BOT/用户。但是我正在进行的外部API调用非常昂贵(~5/~10秒)。我注意到,当我同时命中API端点两次或更多次时,有时我得不到任何数据。只有一个呼叫成功。有什么办法可以解决这个问题吗?我一直在调查工人队列,但不确定这是否太过了 我正在使用mux进行路由。如果您想比外部API更快地处理请求,则需要

我正在编写这个API,它是slack bot应用程序的后端,将被许多用户使用。在我的API中的一个API端点中,我调用一个外部API来获取一些数据,这样我就可以在我的API中对其进行处理,将其发送给BOT/用户。但是我正在进行的外部API调用非常昂贵(~5/~10秒)。我注意到,当我同时命中API端点两次或更多次时,有时我得不到任何数据。只有一个呼叫成功。有什么办法可以解决这个问题吗?我一直在调查工人队列,但不确定这是否太过了


我正在使用mux进行路由。

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

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

如果这是一个24/7繁忙的服务,那么工作者可以按照重复的时间表以任何必要的频率刷新缓存;或者,您可以让请求处理程序将一条消息队列发送给缓存工作程序,通知缓存需要刷新,这样当您没有收到请求时,它就不会一直命中外部API。

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

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

如果这是一个24/7繁忙的服务,那么工作者可以按照重复的时间表以任何必要的频率刷新缓存;或者,您可以让请求处理程序将一条消息队列发送给缓存工作程序,通知缓存需要刷新,这样当您没有收到请求时,它就不会一直命中外部API。

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