【发布时间】:2022-08-04 13:35:29
【问题描述】:
我有一个 Spring Boot WebFlux 服务,它是 I/O 密集型并调用外部资源。
通常,一切正常。但时不时地,我注意到该服务看起来像是在冻结/冬眠。这意味着它可以空闲分钟在通常需要几毫秒才能通过的两行代码之间。
这通常与 I/O 操作有关。例如,从资源 A 获取响应,然后调用资源 B。
我们注意到有时这之间有 10 分钟的间隔 - 好像服务没有可用的线程来处理请求,或者它正在某个地方排队。
这种冻结可能与我们调用的外部服务响应缓慢有关。我们期望 WebFlux 可以毫无问题地处理它,但似乎外部资源的缓慢正在影响我们的服务。
伪正常场景:
10:00:00 - call external service A (responses within 2 seconds)
10:00:02 - getting a response from service A
10:00:02:10 - calling service B after 10 Milliseconds
伪故障场景:
10:00 - call external service A (responses are getting slower, say to 1 minute)
10:01 - getting a response from service A
10:11 - calling service B <----- why did it wait 10 minutes?
当这件事发生时:
- 对服务的请求数量适中且恒定(每秒约 40 个)
- CPU 较低 (~20-40%) 且未达到峰值。
- 线程数从 ~100 增加到 ~150。
有什么想法会导致这样的事情吗?
-
你在任何地方都使用阻塞 IO 吗?如果不是,为什么线程数会增加?此外,如果外部服务很慢,您的服务也不会比这更快。
标签: spring-boot reactive-programming spring-webflux