【问题标题】:Shall I use persistent connections to upload files in intranet?我应该使用持久连接在 Intranet 中上传文件吗?
【发布时间】:2014-01-24 07:20:05
【问题描述】:
  1. 在内网,网络不错
  2. 服务器A会同时通过http服务向服务器B发送大量文件
  3. Http协议为HTTP 1.1,默认使用长连接
  4. [更新] 使用连接池来容纳 100 个连接
  5. [更新]一个连接一次发送一个文件
  6. [更新] Onnection 不会被关闭(持久连接),将被重用于发送下一个文件
  7. 每个文件的大小为 7K 到 30K

问题:

在上述情况下,持久连接会比非持久连接有更好的性能吗?

我问这个问题是因为我们发现上传文件时连接会被阻塞很长时间。我建议使用非持久连接,因为我认为它更稳定,但我的同事建议使用持久连接,因为他认为持久连接具有更好的性能。


更新

查看更新的问题,谢谢~

【问题讨论】:

  • 每个文件都在自己的线程上发送?

标签: java http apache-httpclient-4.x persistent-connection


【解决方案1】:

在 HTTP 1.1 中,您的持久连接允许流水线,但不允许并行。 (See RFC 2616) 这意味着如果您在 100 个线程之间共享您的连接并且每个线程发送一个文件,您将一次发送这 100 个文件(以某种顺序)并按发送顺序接收每个文件的响应.在 100 个线程上发送并没有任何优势,因为它们只是排队一次发送和接收一个。

可能能够使用多个连接更快地发送,因为这将允许它们实际并行运行。但这取决于许多其他因素。根据您的网络,设置和拆除 100 个连接可能比通过一个连接进行管道衬砌要慢。此外,服务器可能不会感谢您打开 100 个单独的连接。更糟糕的是,服务器可能只会在某些时候拒绝你,这很让人头疼。

我建议采取中间道路:例如,打开 5 个持久连接(仅使用 5 个线程)并沿每个连接发送 20 个文档。 HTTPClient 有一个 BasicConnPool 来做这种事情,虽然它可能对你的需求来说太基本了。

【讨论】:

  • 我不明白你的更新。现在您仍在建立 100 个连接但只使用一个?这没有任何意义。
  • 一个连接发送一次,我们池中有100个连接,所以我们可以同时发送100个文件
  • 这是我回答的中间段落。我说的那个可能是个坏主意。
猜你喜欢
  • 1970-01-01
  • 2014-10-05
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多