首页 > 解决方案 > spring 有时会在控制器方法执行之前和之后做一些缓慢的过程吗?

问题描述

我有一个在 k8s 环境中运行的 spring boot 应用程序。

当我进行一些测试以查看我们的应用程序如何处理多个请求时,我注意到应用程序在控制器方法执行之前和之后都会浪费一些时间。该应用程序有一些过滤器在控制器方法执行之前和之后执行,但它们并没有做任何繁重的事情,只是从请求中读取一些信息并删除一些缓存的字符串。

我有跟踪设置,因此我可以跟踪应用程序某些部分的执行,主要是外部调用,但出于测试目的,我在其他部分添加了跟踪。跟踪根跨度在位于过滤器链顶部的过滤器中开始。

您可以在下面的痕迹图像中看到奇怪的行为。红色标记了代表控制器方法的跨度,黑色标记了代表位于过滤器链末尾的最后两个过滤器的跨度的跨度。

这张图片中,我们可以看到,在过滤器链中倒数第二个的 taas_tenant_support_check fitler 完成执行后,控制器方法在 50 毫秒后开始执行。

这张图片中,我们可以看到 taas_remove_bo_user_context 过滤器,它是过滤器链中的最后一个过滤器,在控制器方法完成执行后大约 80 毫秒后执行。

这种行为仅在应用程序在 k8s 环境中运行时被捕获,在我的本地机器上以相同的负载(目前只有 50 个并行请求)这永远不会发生。

运行我们的应用程序的 Pod 最多使用 1 个 CPU 和 2GB 内存。

我还在具有类似资源限制的 docker 容器内的本地计算机上运行了一个应用程序,但没有记录奇怪的行为。

跟踪跨度分批导出,并且导出器在主应用程序的单独线程中运行,我不认为这会减慢我们的速度。

使用调试器,我浏览了 spring 的源代码,以查看执行控制器方法之前和之后发生的情况,但我没有发现任何可能导致这种行为的东西。

有谁知道这里可能发生了什么?

标签: javaspringkubernetes

解决方案


推荐阅读