节流到外部API的传出连接

时间:2018-12-20 17:04:32

标签: c# .net-core

我目前正在使用ASP Core 2.2开发网站。本网站使用外部API。但是我有一个大问题,不知道如何解决。该外部API每个IP / s限制10个请求。如果11个用户单击我网站上的按钮并同时调用API,则该API可能会使我中断几个小时。 API所有者告诉客户注意不要超过限制。你能知道怎么做吗?

1

ps。当然,有100万用户是在开玩笑,但我希望该网站公开可用:)

2 个答案:

答案 0 :(得分:2)

每秒10个请求是一个硬性限制,似乎没有办法解决。因此,您必须最终解决它。

有两个选项:

  1. 直接使用Javascript调用该API。这样,每个用户将能够对所有用户执行10个请求/秒,而不是对所有用户10个请求/秒(推荐)
  2. 将请求排入队列,最多仅以10 / s的速度发送出去(强烈不建议这样做,它会杀死您的线程池,并且在输入的速度大于输出时会阻止所有人访问您的站点)
  3. 当达到10 / s的限制时,请在服务器端放弃请求,并让客户端稍后重试。 (当输入的输入速度>输出时,等待时间将是无限的)

根据API返回的内容,您也许可以将其缓存在服务器端,而不必再次从第三方请求它。

答案 1 :(得分:2)

在这种情况下,您需要考虑无法实时处理请求的可能性。您不希望有成千上万的请求等待访问您无法控制的资源。

如果可以的话,我会回答有关从客户端调用API的答案。

另一个选择是保留当前请求的计数器,将其限制为十个,如果请求超过该容量,则返回503错误。如果您真的不希望经常或曾经超过十个并发请求,但是要确保在发生这种情况的可能性不大时,它不会关闭网站的此功能,那么这是可行的。

如果您实际上希望有大量的请求,那么您将超过十个并发请求,那么您需要将请求排队,但要在与Web应用程序分开的过程中进行。如前所述,如果您有大量的请求在等待相同的资源,则您的应用程序将变得过载。您可以使用完全不同的流程来排队请求,然后客户端将不得不偶尔询问您的应用程序,以查看是否有响应。

最后一种情况的最大缺陷是,这意味着您的用户可能会等待很长时间,因为您的应用程序依赖于无法扩展的有限资源。您可以通过防止应用程序失败的方式来管理它,但不能使应用程序快速响应。