【发布时间】:2015-02-07 10:22:09
【问题描述】:
我们正在运行一个 Http Api,并希望能够对用户在每个时间单位内可以执行的请求数进行限制。当达到这个限制时,我们不希望用户收到错误,例如 Http 429。相反,我们希望增加响应时间。这导致用户可以继续工作,但速度较慢,然后可以选择升级或不升级其付费计划。对于已超过其限制的用户的所有请求,此解决方案可以很容易地使用 Thread.sleep(或类似的东西)在 x 秒内实现。
我们认为,在最坏的情况下,单个服务器的可能连接数可能会出现问题,因为只要我们一直延迟响应,我们就会保持连接打开,从而限制其他可能的连接数.
对 Api 的所有请求都是异步运行的。服务器本身被构建为可扩展的,并且在负载平衡器后面运行。如有必要,我们可以启动额外的服务器。
在搜索这种类型的限制时,我们发现很少有这种限制用户的方式的例子,而且我们发现的例子似乎根本不关心连接耗尽。所以我们想知道这不是问题吗?
我们是否缺少任何缺点,或者这是一个可行的解决方案?我们可以同时打开多少个连接而不会出现问题?我们的愿景能否以另一种方式解决,即不给用户带来错误?
【问题讨论】:
-
听起来像是您应该在网络级别而不是在应用程序内执行的操作。如果您使用
Thread.Sleep(),您将面临无法处理请求的风险,因为线程池中的所有线程都已用完休眠,因此您基本上已经自己DOS了。
标签: c# api .net-4.0 request throttling