为什么网关的过滤器里不能写阻塞代码?阻塞会让吞吐掉到什么程度?Mono.block() 会怎样?放到 boundedElastic 上能救吗?这篇用 20 与 64 个并发请求在 Spring Cloud Gateway 5.0.3 上量出来。
过滤器什么都不做:20 个请求总耗时 0.02 秒,状态码 {200: 20};过滤器运行过的线程: [reactor-http-nio-N],其中 reactor-http-nio 线程共 2 个
过滤器里 Thread.sleep(200)(阻塞事件循环线程):20 个请求总耗时 2.06 秒,状态码 {200: 20};过滤器运行过的线程: [reactor-http-nio-N],其中 reactor-http-nio 线程共 2 个
过滤器里 Mono.delay(200ms)(不阻塞):20 个请求总耗时 0.22 秒,状态码 {200: 20};过滤器运行过的线程: [reactor-http-nio-N],其中 reactor-http-nio 线程共 2 个
过滤器里把 sleep(200) 放到 Schedulers.boundedElastic() 上:20 个请求总耗时 0.23 秒,状态码 {200: 20};过滤器运行过的线程: [reactor-http-nio-N],其中 reactor-http-nio 线程共 2 个
过滤器里调用 Mono.block():20 个请求总耗时 0.01 秒,状态码 {500: 20};过滤器运行过的线程: [reactor-http-nio-N],其中 reactor-http-nio 线程共 2 个;block() 的异常:IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-1阻塞调用让总耗时变成请求数除以线程数乘以单次耗时。
总耗时 1.47 秒,状态码 {200: 64};过滤器运行过的线程: [reactor-http-nio-N],其中 reactor-http-nio 线程共 10 个
对照,Mono.delay(200ms):总耗时 0.23 秒,状态码 {200: 64}等于 CPU 核数,阻塞只是被核数摊薄,不会消失。