Spring 启动 - 创建自定义事件循环

Spring Boot - Create custom event loop

我正在开发一个大型 Spring 引导服务,其中包含大约 6 万行代码。它为每个到达其单个端点的传入请求调用大约 10 个依赖项。有断路器、超时和指标。

该服务不擅长管理苦苦挣扎的依赖项。一旦他们的响应时间变长,服务就需要更多 CPU 并且它的延迟会增加。这很糟糕,因为我们有延迟 SLO。

我们已经对 WebFlux 进行了实验,原型看起来很有前途。现在我们要迁移。

解决这个大项目的一种方法是一个接一个地迁移依赖项。我们可以将它们重写为 Mono<>,然后使用 block() 调用它们。该项目可以立即再次部署。像这样迁移完所有依赖后,将引擎从 MVC 切换到 WebFlux,然后重写 RestController 和其间的所有代码。这可行,但理想情况下,我们希望在迁移第一个依赖项后立即看到性能优势。

是否可以向项目添加一个 WebFlux 事件循环,运行 它在一个单独的线程中并将依赖项一个一个地迁移到其中?那会是什么样子?目前我们使用 @Async 和自定义线程池调用依赖项。

事件循环不是你自己启动的,也不是你自己写的。在 webflux 中,事件循环是由底层网络服务器 (netty) 创建的,运行 是几个事件循环,具体取决于主机有多少个内核。

我看不出有任何方法可以在单个应用程序上同时 运行在下面安装 2 个不同的网络服务器实现。我不确定,spring 团队的某个人需要在这里回答更具体的问题。

老实说,如果这是一个大而重要的项目,我会保留原始服务器,然后使用前面的负载均衡器,开始复制请求并将它们发送到两个服务并实现一个端点, 运行 并联一段时间看效果好,然后关掉并联 运行ning。并同时为 each/a 几个端点执行此操作。

还有用于此目的的特定阴影工具,例如 goreplay

req ---------> LB ------> original
                \
                 \------> webflux


req ---------> LB
                \
                 \------> webflux


// Or for instance goreplay that runs on a host and also 
// shadows requests forward to another service
req ---------> original
                   \
                    \------> webflux

从来没有任何顺利的迁移方式,从来没有。