产生大量线程绝不是一个好主意(当你创建太多线程时,无论如何都可能会耗尽内存)。
通常,Jersey需要为每个请求创建一个线程。这似乎是这种情况,我是否使用async()
(泽西为我创建线程 - 我在调试器中调查了这个),或者不是(我显然必须自己创建线程。
所以,这是一个不够好的具体情况:
我将HTTP发布到远程服务器,速率最高可达500请求/秒。但由于响应可能需要一些时间才能到达(我计算最多30秒),线程总数可以轻松达到数千(此时,JVM进程通常会崩溃)。而且,创造这么多线程真是太疯狂了。对于处理该负载的可用处理器/网络/ OS资源而言,它实际上应该是一块蛋糕。
所以我想做的就是触发请求 - 并在HTTP响应到来时通知操作系统。
target.request(...).async()....
并没有做到这一点(因为那时,泽西岛只会产生自己的线程)。new ClientConfig().property(ClientProperties.ASYNC_THREADPOOL_SIZE, 10)
限制线程数量根本没有用,因为这意味着一次最多会发送10个请求,这显然不是我想要的(它只会堆积) - 队列)。我尝试使用new ClientConfig().connectorProvider(new GrizzlyConnectorProvider())
来获得NIO支持 - 但根本没有看到任何行为上的差异。
那么有没有办法发出请求而不必为每个请求创建一个额外的线程?
答案 0 :(得分:4)
我正在使用CloseableHttpAsyncClient向外部服务发出异步请求。它的工作正常,每秒几百个请求,我没有观察到像你的情况那样的线程数。这是一个外部依赖,您可以通过Maven通过
进行集成<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.0.1</version>
</dependency>
希望这有帮助。
答案 1 :(得分:1)
使用https://github.com/AsyncHttpClient/async-http-client发出请求,它使用netty。它将从请求线程触发它的调用,并回调您的代码,因此它不会占用容器请求线程。