【问题标题】:How to ensure my Reactive application is running in event loop style如何确保我的反应式应用程序以事件循环样式运行
【发布时间】:2019-04-17 04:25:15
【问题描述】:

我正在使用 Spring Boot 2.0.4.RELEASE。我怀疑我的应用程序是否以事件循环样式运行。我正在使用 tomcat 作为我的服务器。

我正在我的应用程序中运行一些性能测试,一段时间后我看到了一个奇怪的行为。请求达到 500 req/second 后,我的应用程序无法提供超过 500 req/second 的服务。通过 prometheus,我能够计算出 tomcat 的最大线程默认为 200。看起来所有线程都被消耗掉了,这就是为什么它不能以超过 500 个请求/秒的速度提供服务。如有错误请指正。

tomcat 服务器能否以事件循环方式运行? 如果可能,如何更改 tomcat 服务器的事件循环大小。

尝试将其更改为码头仍然是同样的问题。想知道我的应用程序是否以事件循环样式运行。

【问题讨论】:

标签: spring-boot spring-webflux project-reactor


【解决方案1】:

嘿,我认为您在项目中做错了什么,可能您的依赖项之一不支持反应式编程。如果您想从异步编程(反应式)中受益,即使为了安全,您的代码也必须是 100 反应式,您必须使用反应式弹簧安全性。 通常,反应式 Spring 应用程序将在 netty 而不是在 tomcat 中运行,因此请检查您的依赖关系,因为 tomcat 不是反应式

【讨论】:

  • 完全移除了对web的依赖。还是没有起色。由于我使用的是 RDBMS 并且它的驱动程序不是响应式的,因此我已将这些调用安排在 Schedulars.elastic() 上。可能是 Schedulars.elastic 限制了吞吐量。
【解决方案2】:

这更像是一种分析。在我的本地机器上运行了一些性能测试后,我能够弄清楚我的应用程序中实际发生了什么。

我所做的是,在本地机器上运行性能测试并通过 JConsole 分析应用程序。

正如我所说,我将所有阻塞 dB 调用安排到 schedulers.elastic。我意识到这是造成瓶颈的原因。因为我的 dB 连接是有限的,而且我使用 hikari 进行连接池,所以我从弹性池中创建的线程数量并不重要。 由于反应式编程更多的是用更少的线程来最大限度地消耗资源,因为线程是以无限的方式创建的,所以它与普通应用程序没有什么不同。

因此,作为解决方案的一部分,我所做的将线程数限制为 100 个,这些线程应该用于 dB 调用。爆炸数量从 500 tps 跃升至 2300 tps。

我知道这不是响应式应用程序应该期望的数字,它具有更多功能。因为现在我别无选择,只能忍受非反应式驱动程序。等待 mssql 服务器反应式驱动程序的生产级可用性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2022-01-10
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多