谁负责限制网络请求?

时间:2009-11-28 14:38:38

标签: c# httpwebrequest throttling

我正在开发一个从第三方网站检索信息的类库。如果在设定的时间段内(~0.5秒)内发出的请求太多,正在访问的网站将停止响应。

我的库的公共方法直接与Web服务器上的文件资源相关。换句话说,每次调用方法时,都会创建HttpWebRequest并将其发送到服务器。如果一切顺利,则会将XML文件返回给调用者。但是,如果这是第二次网络请求的时间少于0.5秒,请求超时。

我的困境在于我应该如何处理请求限制(如果有的话)。显然,我不希望呼叫者等待响应 - 特别是如果我完全确定他们的请求会超时。

我的库是否更有意义对我创建的Web请求进行排队和限制,或者如果客户端在API调用之间等待的时间不长,我的库是否应该抛出异常?

4 个答案:

答案 0 :(得分:6)

库的概念是尽可能少地为其客户端代码提供担忧。因此,我会使库成为排队请求并及时返回结果的工作。在理想的世界中,您将使用回调或委托模型,以便客户端代码可以异步操作,而不是阻止UI。您还可以提供跳过队列的选项(如果操作太快则失败),甚至可能在队列模型中提供优先级。

我还认为图书馆作者有责任默认成为一个好公民,并且图书馆的默认操作是遵守数据提供者的条件。

答案 1 :(得分:3)

我会说两者 - 你正在处理两个独立的系统,两者都应采取措施保护自己免受过度负荷。 Web服务器应拒绝传入连接,客户端库应采取措施减少对缓慢或无响应的外部服务的请求。在客户端处理此问题的常见模式是“断路器”,它包含对外部服务的调用,并在失败后的一段时间内快速失败。

答案 2 :(得分:2)

这是Web服务器的责任,imo。因为关键负载取决于硬件,网络带宽等许多超出应用程序控制范围的事情,所以它不应该关注尝试处理它。 IIS可以根据各种配置选项限制流量。

答案 3 :(得分:1)

它是什么类型的客户?这是一个交互式客户端,例如:基于GUI的应用程序吗?

在这种情况下,您可以将其等同于Web浏览器场景,并让超时表面显示给调用者。此外,如果您确定此Web服务器是限制请求,您可以告诉客户端他必须等待一段时间再重试。这样,客户端将不会继续重新发出请求,并且会知道第一次超时发生时发出请求的速度太快是徒劳的。