gpt4 book ai didi

spring-webflux - 正确登录响应式(Reactive)应用程序 - WebFlux

转载 作者:行者123 更新时间:2023-12-05 06:00:54 32 4
gpt4 key购买 nike

上次我在考虑在我们的应用程序中正确使用记录器。例如,我有一个返回用户流的 Controller ,但在日志中,我看到“获取用户”日志正在被另一个线程而不是处理管道上的线程记录,但这是一个好方法吗?

@Slf4j
class AwesomeController {

@GetMapping(path = "/users")
public Flux<User> getUsers() {
log.info("Fetch users..");

return Flux.just(...)..subscribeOn(Schedulers.newParallel("my-custom"));

}
}

在这种情况下,使用了两个线程,从我的角度来看,这不是一个好的选择,但我找不到在响应式(Reactive)应用程序中使用记录器的良好实践。我认为下面的方法更好,因为分配内存来自处理线程,而不是来自 spring webflux 线程,它可能会阻塞但记录器。

   @GetMapping(path = "/users")
public Flux<User> getUsers() {

return Flux.defer(() -> {
return Mono.fromCallable(() -> {
log.info("Fetch users..");
.....
})
}).subscribeOn(Schedulers.newParallel("my-custom"))
}

最佳答案

正常的做法是将记录器配置为异步(这通常必须根据注释明确说明,但所有现代日志记录框架都支持它)然后“正常”包含它(或者作为单独的行就像你在那里,或者在副作用方法中,例如 doOnNext() 如果你希望它在 react 链中途。)

如果您想确保记录器的调用没有阻塞,请使用 BlockHound确保(无论如何这都不是一个坏主意。)但无论如何,我看不到你的第二个例子的用例 - 这使得代码很难理解,没有真正的优势。

最后要注意的一件事 - 请记住,如果您像上面那样单独包含日志语句,而不是作为 react 链的一部分,那么它将在方法调用时而不是订阅时执行。在这两种情况几乎同时发生的情况下,这可能无关紧要,但如果(例如)您要返回一个可能被多次订阅的发布者,那将是相当困惑的——在这种情况下,您只会看到“Fetch users...”语句一次,浏览代码时并不明显。

关于spring-webflux - 正确登录响应式(Reactive)应用程序 - WebFlux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67447315/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com