【发布时间】:2021-01-27 08:54:17
【问题描述】:
我有一个默认使用 netty 的 spring boot webflux 应用程序。 我们的业务要求之一是请求应在 2 秒内超时。
当向应用发送的请求很少时,一切都很好,但是当请求负载增加时(例如 Jmeter 每秒超过 40 或 50 个并发),有时它们都会超时,因为每个请求都比 2-第二个阈值。
我花了很长时间在网上阅读内容并研究可能导致此问题的原因,但没有成功。当请求同时发送时,大多数最终会花费很长时间,而有问题的部分是向其他微服务发出外部 HTTP 请求的地方。我所有的测试都是本地的,我已经测试了微服务,它们看起来足够快,可以处理大负载,所以微服务本身不是问题。
我知道 netty 使用事件循环并且不会为每个请求创建一个线程。 我相信可能有同步任务阻塞了这几个网络线程。出于这个原因,我进行了大量重构,并在 Mono 反应链中使用了“.publishOn(Schedulers.boundedElastic())”或“.subscribeOn(Schedulers.boundedElastic())”。重构后大部分操作似乎都在弹性线程上运行,而不是“reactor-http-nio-x”(根据日志),但这样做并没有解决主要问题,问题仍然存在。
如果有人能指导我做我应该做的事情,那将是一个巨大的帮助。在这一点上,我没有更多的改进可做,并且认为我可能一直以错误的方式看待这个问题并且我的方法并不正确。
我没有附加任何代码,因为应用程序很大,我仍然不知道实际问题出在哪里。
【问题讨论】:
-
你找到解决办法了吗?
-
我们在生产中也遇到了类似的问题,事实证明,主要原因是网络问题导致随机打断导致某些服务调用比平时花费更长的时间。当我发布这个问题时,这是基于本地测试,一切都在本地运行。如此简短的回答是我还没有找到任何解决方案。我可能会尝试 ZZ 5 关于避免使用 webClient 的建议。
标签: spring-boot performance blocking