HTTP请求大量请求的性能

时间:2009-10-13 13:09:36

标签: .net vb.net performance httpwebrequest

我正在寻找有关如何优化以下过程的一些建议:

App读取csv文件。 对于文件中的每一行,都会创建一条XML消息 每条XML消息都通过HTTPWebRequest

发布到URL

此过程旨在处理少量消息(一次最多约200个),毫不奇怪地认为已经改变,现在预计一次最多可处理3000个消息。

用于发布消息的代码在这里:

Public Function PostXml(ByVal XML As String) As HttpStatusCode

        Try
            Dim Bytes As Byte() = Me.Encoding.GetBytes(XML)
            Dim HTTPRequest As HttpWebRequest = DirectCast(WebRequest.Create(Me.PostURL), HttpWebRequest)

            With HTTPRequest
                .Method = "POST"
                .ContentLength = Bytes.Length
                .ContentType = "text/xml"
                .Credentials = New NetworkCredential(_Settings.NTSPostUsernameCurrent, _Settings.NTSPostPasswordCurrent)
            End With

            Using RequestStream As Stream = HTTPRequest.GetRequestStream()
                RequestStream.Write(Bytes, 0, Bytes.Length)
                RequestStream.Close()
            End Using

            Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse)
                Return Response.StatusCode
            End Using

        Catch ex As WebException

            If ex.Message.Contains("(500) Internal Server Error") Then
                Return HttpStatusCode.InternalServerError
            Else
                Throw
            End If
        End Try

这可以在缓存所使用的连接方面进行优化吗?目前该线路有明显延迟: 在建立连接时Using Response As HttpWebResponse。 有没有一种缓存方法,所以相同的连接用于所有3000条消息,而不是为每条消息创建一个新的连接?

感谢任何建议。

**更新。谢谢你的回复。为了澄清,由于系统中其他地方的限制,我目前仅限于发送多条消息。在另一端(接收方)响应请求时有明显的延迟,但这不在我的控制范围内。我正在努力确保发送过程尽可能高效(尽管有外部因素)。

4 个答案:

答案 0 :(得分:1)

.NET已经有连接缓存......如果你没有处理响应,你会很快看到:)(只是为了澄清,你在这里做的是正确的。我是一个错误经常看到有一个Using语句......由于连接缓存而导致问题正确。)

我怀疑这不是建立连接的情况,而是发出请求 - 换句话说,时间是在你无法控制的区域。

我建议您使用WiresharkFiddler来确定实际发生的时间 - 可能它不仅仅是Web服务本身吗? (或者无论你在说什么。)

另一个选择是使用多个线程来加快速度 - 但是在这一点上,不要忘记增加每个主机的连接数(在app.config,IIRC的connectionSettings部分)。< / p>

答案 1 :(得分:1)

在您的情况下,图片中有两件事,您要发布的实体主体的大小以及您正在使用的身份验证方法。

此外,.NET HttpWebRequest不会一次性发送请求标头和POST正文。它首先发送请求标头(它向传出请求添加Expect:100-continue标头)。现在,如果服务器已准备好接受数据,它应回复“100 continue”响应。否则,它应该发送最终响应,在这种情况下可能是“401身份验证被拒绝”。如果服务器在350ms内没有发送“100 continue”,则cllient将继续发送数据。

因此,为了进一步优化,我们需要知道:

1)什么是身份验证协议? 2)您发布的XML正文的平均大小是多少? 3)服务器是否使用XML进行任何繁重的操作?这很可能解释了为什么你看到GetResponse()而不是GetRequestStream()的延迟。 有些事要尝试:

1)在服务点上设置Expect100Continue = false。 2)如果您的系统正在执行NTLM身份验证,那么您可以尝试以下操作:1)使用目标服务器的凭据创建GET webrerquest。在请求上设置connectionGroupNname。为后续请求重用相同的连接组名称。由于NTLM主要是连接身份验证机制,因此第一个GET请求将为您启动连接,后续请求将重用该连接。

还有一件事,你在做多线程操作,你正在运行上述代码的同步线程吗?在这种情况下,您遇到了客户端上的连接限制问题 - 每个HTTP / 1.1服务器最多同时存在2个连接。您可以尝试突破限制(ServicePointManager.DefaultConnectionLimit = 1000)。

最后,正如其他人所建议的那样,您可能需要使用wireshark / netmon获取网络嗅探,以便了解延迟的位置。

答案 2 :(得分:0)

这里的问题是在对象创建语句中,创建一个对象然后如果你做了数千次就破坏它就非常昂贵....

如果你一次只想要大约3k~5k,我就会拿出使用语句让垃圾收集器做它的工作。

但如果你希望一次超过5k,那么这绝对不是一个选择......

答案 3 :(得分:0)

我已经开始和关闭了几周,并使用两种方法实现了显着的性能提升:

  1. 我现在每个XML文件发布多条消息。
  2. 我设置了三个线程,两个线程同时发布消息,第三个将消息归档到文件系统。
  3. 使用这种方法,我已经成功实现了超过100%的性能提升(有时高达200-200%)。