我有一个基于 Spring 的高度并发 Web 应用程序,其中每个请求都会生成数百个线程,每个线程都想要访问单例 bean 和请求范围的 bean。由于对 ConcurrentHashMap 的竞争访问,以及调用代理方法时通常较高的 CPU 开销,我们在整个 Spring 代码中看到了瓶颈。
实验表明,硬编码 CglibAopProxy.getCallbacks() 以使用 DynamicUnadvisedInterceptor 而不是 DynamicAdvisedInterceptor 可以显着减少 CPU 使用率和延迟。我们的应用程序的建议 Bean 恰好为零,并且禁用建议没有已知的缺点。
我的实验涉及:
我预计性能会小幅提升,但应用程序会损坏,但我得到了很大的收益,而且应用程序看起来还不错。
实现这一点的最佳方法是什么?理想情况下不重写核心 Spring 类。 :)
编辑:建议使用Spring中的每个代理bean,这要感谢Spring本身。因此,没有受支持的方法来消除代理 bean 的开销。
此性能优化是通过核心 Spring 中的代码更改实现的:https://github.com/spring-projects/spring-framework/issues/32104