7

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

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

我的困境在于我应该如何处理请求限制(如果有的话)。显然,我不希望调用者坐在那里等待响应——尤其是如果我完全确定他们的请求会超时。

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

4

4 回答 4

6

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

我也相信图书馆作者有责任默认做一个好公民,图书馆的默认操作是遵守数据提供者的条件。

于 2009-11-29T15:59:15.087 回答
3

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

于 2009-11-28T14:57:02.890 回答
2

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

于 2009-11-28T14:46:18.250 回答
1

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

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

于 2009-11-29T15:51:16.230 回答