我有一个Web应用程序,它只是作为Front Controller使用Spring Boot来调用其他远程REST服务,我将Spring的DeferredResult与在Scheduler.computation()上订阅的Observables结合起来。
我们也在使用JMeter来强调Web应用程序,我们注意到当JMeter中调度的并发线程数从25增加时,请求开始失败,状态为500,没有响应数据,也没有任何日志显然是一个非常可管理的#34; Tomcat的编号。
使用VisualVM分析如何创建和使用线程的问题,我们意识到使用rx.Schedulers会以某种方式影响Tomcat NIO创建的线程数。让我总结一下我们基于所使用的rx.Scheduler和在JMeter中测试的测试,包含100个用户(线程):
由于我们正在使用Schedulers.computation()并且我的本地计算机有4个可用处理器,因此4个EventLoop线程池由RxJava(名为RxComputationThreadPool-XXX)和仅10个Tomcat(名为http-nio)创建-8080-exec-XXX),根据VisualVM:
http://screencast.com/t/7C9La6K4Kt6
此调度程序似乎基本上充当Scheduler.newThread(),因此在需要时始终会创建新线程。同样,我们可以看到很多线程由RxJava创建(名为RxNewThreadScheduler-XXX),但只有10个用于Tomcat(名为http-nio-8080-exec-XXX),根据VisualVM:
http://screencast.com/t/K7VWhkxci09o
如果我们在RxJava中禁用创建新线程,可以通过设置Schedulers.immediate()或从Observable中删除它,然后我们会看到Tomcat线程的预期行为,即100 http-nio- 8080-exec对应于为JMeter测试定义的用户数:
http://screencast.com/t/n9TLVZGJ
因此,基于我们的测试,我们清楚地看到RxJava与Scheduler和Tomcat 8的组合在某种程度上限制了Tomcat创建的线程数...而且我们不知道为什么或如何正在发生。
任何帮助都会受到赞赏,因为这阻碍了我们迄今为止的发展。
提前致谢。