问题描述
我有一个spring boot webflux应用程序,默认情况下使用netty。 我们要求的一项业务要求是请求应在2秒内超时。
当很少的请求发送到应用程序时,一切都很好,但是当请求负载增加时(例如Jmeter每秒并发40或50多个),有时它们全部超时,原因是每个请求花费的时间比2-第二个阈值。
我花了很长时间阅读在线内容,并调查可能导致此问题的原因,但没有成功。当同时发送请求时,大多数最终会花费很长时间,而问题所在是向其他微服务发出外部HTTTP请求。我所有的测试都是本地的,我已经测试了微服务,它们看起来足够快以应付大的负载,所以微服务本身不是问题。
我知道netty使用事件循环,并且不会为每个请求创建线程。 我相信可能有同步任务阻止了这几个netty线程。因此,我已经进行了大量的重构,并且在Mono反应链中具有“ .publishOn(Schedulers.boundedElastic())”或“ .subscribeOn(Schedulers.boundedElastic())”。重构后,大多数操作似乎都在弹性线程上运行,而不是“ reactor-http-nio-x”(根据日志),但是这样做并没有帮助主要问题,问题仍然存在。
如果有人可以指导我进行我应该做的事情,那将是巨大的帮助。在这一点上,我没有其他需要改进的地方,并且认为我可能一直在以错误的方式看待它,而我的方法也不正确。
我还没有附加任何代码,因为应用程序很大,我仍然不知道实际问题出在哪里。
解决方法
我遇到了同样的问题。我没有找到这个问题的根本原因,但是当我从 WebClient
切换到 RestTemplate
并且每个客户端(外部服务)都有专用的线程池时,问题就解决了。我运行了一个blockhound来查找我是否在流中的某个地方阻塞,但它没有找到任何东西。我还尝试使用增加的 NIO 工作线程池数量(默认情况下它等于核心数)来部署我的应用程序,并且有一些改进,但毕竟 RestTemplate
产生了最佳性能。所以我仍然使用 Webflux 堆栈,但我不再使用 WebClient
,并且在高负载下的性能很好。