如何在Java中执行非阻塞HTTP调用?

问题描述 投票:1回答:1

我有一个第三方API,我使用HTTP GET请求进行调用。每个请求都需要几秒钟才能得到响应。

[当前,我正在使用CompletableFuture,我正在64号的FixedThreadPool上执行。这导致线程被阻塞,直到它收到GET请求的响应为止,即,线程在发送GET响应后一直处于空闲状态,直到它们收到为止一个答复。因此,我可以发送的同时请求的最大数量受到线程大小的限制,即此处为64。

我可以使用什么代替CompletableFuture,这样我的线程就不会闲着等待响应?

java completable-future
1个回答
0
投票

正如@ user207421所说:

  • 真正的异步(即事件驱动)HTTP客户端应用程序很复杂。
  • 一个多线程(但从根本上来说是同步的)HTTP客户端应用程序更简单,并且可以扩展到与您拥有的内存一样多的线程。
  • 实际瓶颈是可能等于您的物理网络带宽或可用的CPU。如果您达到了这些限制中的任何一个,则:

    • 增加线程池中的线程数将无济于事,并且
    • 切换到异步模型将无济于事。
  • 第三种可能性是瓶颈是服务器端资源限制或速率限制。增加客户端线程数可能有帮助,没有效果,或者使问题更严重。这将取决于服务器的实现方式,等等。

如果瓶颈实际上是线程数,那么您可以尝试的一件事是减小工作线程堆栈的大小,以便可以运行更多线程。默认堆栈大小通常为1MB,并且可能大大超过所需的大小。

周围有一些Java异步HTTP客户端库。但我从未使用过,也无法推荐。和@ user207421一样,我也不相信更改的努力实际上会有所回报。


因此,我可以发送的同时请求的最大数量受到线程大小的限制,即此处为64。

是的。但是,发送更多同时请求可能无济于事。如果线程处于空闲状态,则可能表示瓶颈是网络,还是服务器端的something

我可以[做什么],以使我的线程不会闲着等待响应?

这实际上不是问题。空闲线程仅使用内存(以及一些在这里可能无关紧要的次要影响)。

如果客户端在等待时还有其他事情要做,线程调度程序将切换到另一个线程。

最后,如果您担心大量空闲的工作线程池(等待下一个任务完成)的开销,请使用执行服务或连接池,该服务或连接池可以缩小并增加其线程池以满足不断变化的工作负载。

© www.soinside.com 2019 - 2024. All rights reserved.