对于大量的请求HTTP请求的性能(HTTP Request performance for larg

2019-09-29 13:14发布

我在寻找如何优化下面的过程中的一些建议:

应用程序读取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

可这在缓存中使用的连接方面进行优化? 目前有在该行一noticable延迟: Using Response As HttpWebResponse而连接而成。 是否有缓存此所以相同的连接用于为每个消息被创建的所有3000条消息,而不是一个新的连接的方式是什么?

任何建议感激地收到。

**更新。 感谢您的答复。 为了澄清,我目前仅限于发送多条消息,由于系统其它地方的限制。 有在响应在另一端(接收器)的请求的延迟noticable但是这是我的控制之外。 我想,以保证发送的过程尽可能(外部因素仍然)为有效。

Answer 1:

.NET已经拥有连接缓存...如果你不处置的响应,你会看到,很快:)(我想弄清楚,你在这里做正确的事情。我经常看见一个错误是不是Using声明......这正是导致由于连接缓存的问题。)

我怀疑这是不是建立连接 ,但提出请求的情况下-换句话说,时间都花在地区的控制之外。

我建议你使用Wireshark的或小提琴手到哪里工作的时候实际发生-也许它不只是Web服务本身? (或任何你在跟谁说话。)

另一种方法是使用多线程加快这-但在这一点上,不要忘记增加每台主机的连接数(在connectionSettings app.config中的一部分,IIRC)。



Answer 2:

对你来说,有两件事情是在图片中,您发布的实体主体的大小和所使用的身份验证方法。

此外,.NET的HttpWebRequest不发送请求头和POST身体在一杆。 它首先发送请求头(它增加了一个期望值:100继续报头添加到传出请求)。 现在,如果服务器已准备好接收数据,它应该以“100继续”响应回复。 否则,它应该发送一个最终响应,在这种情况下可能会是一个“401认证被拒绝”。 如果服务器不发送“100继续”内350毫秒,那么cllient将继续和发送数据。

因此,为了优化futher,我们需要知道:

1)什么是认证协议? 2)什么是您发布的XML体的平均尺寸是多少? 3)为服务器做任何重手操作与XML? 这将最有可能解释为什么你看到的GetResponse中的延迟(),而不是在GetRequestStream()。 有些事情尝试:

1)设置Expect100Continue =在服务点假。 2)如果您的系统正在做NTLM身份验证,那么你可以尝试以下方法:1)创建凭证到目标服务器一个GET webrerquest。 坐落在请求connectionGroupNname。 重用后续请求的相同的连接组名称。 由于NTLM主要是连接AUTH机制,第一个GET请求将主要为你后续请求的连接,将重用该连接。

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

最后,正如其他人所说,你可能需要使用Wireshark的顺序/网络监视器,看看那里的延迟在于获得网络嗅探。



Answer 3:

这里的问题是在对象创建语句,这是非常昂贵的,以创建一个对象,然后摧毁它,如果你正在做上千次....

如果你只希望有在同一时间大约3K〜5K我会拿出using语句,让垃圾收集器做的工作。

但是,如果你希望在同一时间有超过5K,那么这绝对不会是一个选项...



Answer 4:

我一直在这现在打开和关闭了几个星期,并已取得了使用两种方法显著的性能提升:

  1. 我现在每次发布的XML文件多封邮件。
  2. 我有设置三个线程,2个线程同时发布消息,第三档的消息到文件系统。

使用这种方法,我已经成功地实现了超过100%的性能提升(有时高达200-200%)。



文章来源: HTTP Request performance for large volumes of requests