随着应用程序负载的增加,Spring集成请求变慢



我们有一个使用java8+Springboot+Spring Integration的web应用程序。我们在应用程序中使用DirectChannels进行消息传输。此应用程序有两个入站适配器(a-SOAP web服务b- MQ),还有两个出站适配器调用:

  1. 对于审计,我们有另一个通过Rest api调用的应用程序。
  2. 我们的应用程序接收到的请求被发送到x应用程序,这些是rest调用。

对于x应用程序,我们正在做httpConnection池,我们有defaultMaxPerRoute值为100和maxTotal值为200。

问题:

我们正在使用60个用户对应用程序进行负载测试,耗时约30分钟。最初,应用程序处理消息的速度非常快。在调用上面的x应用程序之前,请求在应用程序内最多停留1sec。

然而,我们观察到的是,在某个点之后,应用程序变得非常慢,甚至一个特定请求的简单方法执行也需要大约2秒,请求在应用程序中保留大约10-15秒,这阻碍了应用程序的性能。对于所有不特定于任何类型或api的请求,都可以观察到这一点。

我们无法理解是什么导致了这种缓慢。我们在应用程序中添加了多个记录器,但仍然没有得到任何线索。我们甚至检查了应用程序日志,没有内存不足错误或没有充分利用CPU。

如果有人能分享一些意见,告诉我们哪里可能出错,或者我们还需要检查什么,那就太好了。

下面是一个正在占用时间的请求的日志语句。我在每个通道的开始和结束处添加了记录器。很明显,即使将请求从一个通道传递到另一个通道,也需要大约2秒的时间。一个简单的变压器也需要2秒。所以我不能确定这个问题的根本原因。

channel 1
2022-11-22 09:24:51 Transformer [INFO] converted the Source object to String xml for message 
2022-11-22 09:24:54 AuditService [DEBUG] Completed first channel for : 

channel 2
2022-11-22 09:24:56 AuditService[DEBUG] Creating entry audit for operation
2022-11-22 09:24:59 AuditService [DEBUG] log just before pre rest channel call
channel 3 
2022-11-22 09:25:02 AuditService [DEBUG] starting rest pre channel 
2022-11-22 09:25:05 RequestTransformer [DEBUG] About to process request 
2022-11-22 09:25:05 RequestTransformer [DEBUG] The json after conversion 

channel 4
2022-11-22 09:25:07 AuditService [DEBUG] Completed request sent audit for operation
2022-11-22 09:25:08 AuditService[DEBUG] Completed request sent audit for operation

我找到了这个问题的根本原因。问题出在spring核心库中。在我们的代码中,我们使用了@Header注释,它触发了SpringGenericConversionService其中有一个converterCache被创建,并且总是发生缓存丢失,因为TypeDescriptor类的equals方法对注解有错误的逻辑。因此,当我们执行负载测试时,随着请求的增加,由于每次Map大小和缓存丢失的增加,性能会迅速下降。

github url: https://github.com/spring-projects/spring-framework/issues/19626

提交url修复https://github.com/spring-projects/spring-framework/commit/e38c020535dc5d6b326d5e22f8a59dc35ba7361a:

  • 修复1:将Spring版本更新到4.3.6或更高版本。

  • 修复2:我删除了@Header注释的引用,因为它们很少,我可以使用Spring集成的Message对象获得header值(我们也在问题识别后升级到最新版本的Spring和SpringBoot)。

最新更新