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
从来没有任何顺利的迁移方式,从来没有。
我正在开发一个大型 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
从来没有任何顺利的迁移方式,从来没有。