FSharp.Data Http Utilities - 是否可以不要求响应?

3

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

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

那行代码会被执行数百次。

查看 Fiddler,我很快就会耗尽某些连接或线程池,大约有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) 也非常新。是否有任何选项可以指示库忽略响应并避免阻塞,或者我可以使用语言做些什么来帮助?


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

4
如果您从同一客户端访问Web服务器,很可能会遇到服务器上的客户端限速。 Web服务器通常仅允许来自同一客户端的有限数量的请求。进一步的请求将排队,并且只有在活动请求之一完成时才进行处理。
服务器允许的并发客户端请求数量取决于特定服务器软件以及如何配置该软件,但该数字通常以几个为单位。
我第一次遇到这个问题是大约10年前,当时我只能得到2个并发客户端连接。
请注意,Web服务器通常可以愉快地处理数千个并发请求,只要它们来自不同的客户端即可。
因此,您无法从单个客户端对基于HTTP的服务进行压力测试。你需要一个分布式的客户端组。压力测试是困难的。

那是我的第一反应,马克,但后来我创建了一个小批处理文件,其中有10个“start app.exe”行,吞吐量大幅提高。 - EightyOne Unite
1
是的,我也看到了。除此之外,我没有其他解释,可能这足以让服务器将每个进程视为不同的客户端。至少,在我遇到这个问题的最后一次,这比试图找出问题是否在其他地方更容易修复,所以我最终采取了这种方法。 - Mark Seemann

3

我没有足够的声望来评论,但正如Mark所说,连接的默认限制实际上是2个。

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

System.Net.ServicePointManager.DefaultConnectionLimit <- numberOfConnections

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接