Chr*_*her 8 java nio jersey grizzly jersey-client
产生大量线程绝不是一个好主意(当你创建太多时,你可能会耗尽内存).
通常,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支持 - 但根本没有看到任何行为上的差异.
那么有没有办法发出请求而不必为每个请求创建一个额外的线程?
小智 5
我正在使用CloseableHttpAsyncClient向外部服务发出异步请求。它每秒可以处理几百个请求,效果很好,我还没有观察到像您这样的线程数量。这是一个外部依赖关系,您可以通过以下方式通过Maven进行集成
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
归档时间: |
|
查看次数: |
5406 次 |
最近记录: |