同步高并发的HTTP请求(HttpURLConnection)?
Posted
技术标签:
【中文标题】同步高并发的HTTP请求(HttpURLConnection)?【英文标题】:Sync HTTP request (HttpURLConnection) with high concurrency? 【发布时间】:2020-09-11 01:51:12 【问题描述】:我在我的 Java (Spring) 应用程序中使用 HttpURLConnection
将 HTTP 请求发送到外部第三方服务器。我每秒需要大约 1000 个 http 请求。
然而,恕我直言HttpURLConnection
是同步的,因此一个线程只能做一个 http请求,只有在那个请求完成后,这个线程才能做下一个要求。因此,这似乎效率不高,我怀疑这甚至无法处理(如果我错了请纠正我,例如这实际上非常有效)。
不知道有没有好办法处理这些?恕我直言,我将使用一个包含 100 个线程的线程池(执行程序)。
附:我不能使用任何其他库,例如 HttpClient
,因为该 SDK 包是由第三方提供的:/
非常感谢!
【问题讨论】:
为什么 HttpClient 不在桌面上,但 HttpURLConnection 仍然可用?原始套接字呢? @Charlie 不幸的是,我使用的是第 3 方库(例如小米 Push),我没有他们的源代码,只有一个 jar 文件:(他们选择 HttpURLConnection。 【参考方案1】:1.你在一个线程中的请求是对的。在HttpURLConnection文档中有提到
* Each HttpURLConnection instance is used to make a single request
* but the underlying network connection to the HTTP server may be
* transparently shared by other instances. Calling the close() methods
* on the InputStream or OutputStream of an HttpURLConnection
* after a request may free network resources associated with this
* instance but has no effect on any shared persistent connection.
* Calling the disconnect() method may close the underlying socket
* if a persistent connection is otherwise idle at that time.
*
这意味着你可以使用 openConnection 来获取一个新的 HttpURLConnection 实例,然后请求并关闭它。到 HTTP 服务器的底层网络连接可能会被其他实例透明地共享。
【讨论】:
所以任何关于如何有效地做到这一点的建议:/ 谢谢!【参考方案2】:Socket
和SocketChannel
s 可能是一个不错的选择,尽管您必须“推出自己的”HTTP,如果您必须处理 HTTPS,这将非常不容易。它们是标准 JRE 的一部分,也可以异步使用。当您使用异步时,您会遇到一些麻烦的代码,因为 Selector
API 有点难以使用,但它肯定会很快并且开销很低。
您也许可以使用自定义 SSLSocketFactory 来操纵套接字,以便您可以直接访问套接字以从中获取 SocketChannel。
【讨论】:
抱歉,我无法使用 HttpURLConnection 触摸代码,该代码位于某些 3rd 方库的深处 :(以上是关于同步高并发的HTTP请求(HttpURLConnection)?的主要内容,如果未能解决你的问题,请参考以下文章