同步高并发的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】:

SocketSocketChannels 可能是一个不错的选择,尽管您必须“推出自己的”HTTP,如果您必须处理 HTTPS,这将非常不容易。它们是标准 JRE 的一部分,也可以异步使用。当您使用异步时,您会遇到一些麻烦的代码,因为 Selector API 有点难以使用,但它肯定会很快并且开销很低。

您也许可以使用自定义 SSLSocketFactory 来操纵套接字,以便您可以直接访问套接字以从中获取 SocketChannel。

【讨论】:

抱歉,我无法使用 HttpURLConnection 触摸代码,该代码位于某些 3rd 方库的深处 :(

以上是关于同步高并发的HTTP请求(HttpURLConnection)?的主要内容,如果未能解决你的问题,请参考以下文章

想玩转JAVA高并发,这些概念你必须懂

异步处理http请求同步返回结果

java rsa加密,高并发如何解决

如何处理高并发量的HTTP请求

Java高并发-概念

大数据量下高并发同步的讲解(转)