【问题标题】:FSharp.Data Http Utilities - Is it possible to not require a response?FSharp.Data Http Utilities - 是否可以不需要响应?
【发布时间】:2015-06-06 15:12:29
【问题描述】:

我正在编写一个压力测试应用程序,我正在使用 FSharp.Data 来处理这样的 Http 请求......

let! x = Http.AsyncRequestString(url, httpMethod = "POST", headers = getHeaders, body = getFormVals, silentHttpErrors = true)

该行被执行了 100 次。

看看提琴手,我很快就耗尽了一些连接或线程池,大约 30 个左右的请求一次全部关闭。在那之后,应用程序开始变慢,并且请求的吞吐量看起来与我正在点击的 URI 的响应能力相关联。当一个 200 返回时,另一个请求出去了。

包含函数位于 async{} 块内(因此是 let!)。

我想要做的是完全忽略响应,但是如果我将行更改为 ...

Http.AsyncRequestString(url, httpMethod = "POST", headers = getHeaders, body = getFormVals, silentHttpErrors = true) |> ignore

...根本没有发送请求。我不知道为什么会这样。

我对 F# 比较陌生,对这个特定的库 (http://fsharp.github.io/FSharp.Data/library/Http.html) 也很陌生。是否有任何选项我必须指示库我不在乎响应是什么而不是阻止,或者我可以用语言做些什么来提供帮助?

【问题讨论】:

  • Http.AsyncRequestString 返回一个与Task<string> 非常相似的Async<string>。由于您忽略了它,因此异步代码永远不会运行。您可以运行它并像这样丢弃结果:Http.AsyncRequestString(...) |> Async.StartAsTask |> ignore,但是我怀疑这会解决您的问题,因为它仍然会等待每个请求的响应。

标签: f# stress-testing f#-data


【解决方案1】:

如果您从同一个客户端访问网络服务器,您很可能会在服务器上遇到客户端限制。 Web 服务器只允许来自同一个客户端的有限数量的请求是很正常的。进一步的请求会排队等待,并且仅在其中一个活动请求完成时才会处理。

服务器允许多少并发客户端请求取决于具体的服务器软件及其配置方式,但数量通常以一位数或两位数衡量。

我第一次被这个问题困扰大约是 10 年前,当时我只有 2 个并发客户端连接。

请注意,Web 服务器通常会很乐意处理数千个并发请求,只要它们来自不同的客户端

因此,您无法从单个客户端对基于 HTTP 的服务进行压力测试。为此,您需要一组分布式客户端。压力测试是困难

【讨论】:

  • 这是我的第一个想法,马克,但后来我创建了一个包含 10 行“启动 app.exe”的小批处理文件,吞吐量急剧上升。
  • 是的,我也看到了。我没有任何解释,除了这可能足以让服务器将每个进程视为不同的客户端。至少,上次我遇到这个问题时,这对我来说比试图找出问题是否出在其他地方更容易,所以这就是我最终做的事情。
【解决方案2】:

我没有足够的代表发表评论,但正如 Mark 所说,连接的默认限制实际上是 2。

在发出任何 http 请求之前,尝试在代码中将 System.Net.ServicePointManager.DefaultConnectionLimit 设置得更高。

System.Net.ServicePointManager.DefaultConnectionLimit <- numberOfConnections

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 2013-04-06
    • 1970-01-01
    • 2014-01-28
    • 2020-04-17
    • 2016-10-13
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多