【发布时间】:2021-08-10 09:29:49
【问题描述】:
考虑一个 HTTP 控制器端点,它接受请求、验证然后返回 ack,但同时在后台做一些“繁重的工作”。
有 2 种方法使用 Reactor(我感兴趣)可以实现:
第一种方法
@PostMapping(..)
fun acceptRequest(request: Request): Response {
if(isValid(request)) {
Mono.just(request)
.flatMap(service::doHeavyWork)
.subscribe(...)
return Response(202)
} else {
return Response(400)
}
}
第二种方法
class Controller {
private val service = ...
private val sink = Sinks.many().unicast().onBackpressureBuffer<Request>()
private val stream = sink.asFlux().flatMap(service::doHeavyWork).subscribe(..)
fun acceptRequest(request: Request): Response {
if(isValid(request)) {
sink.tryEmitNext(request) // for simplicity not handling errors
return Response(202)
} else {
return Response(400)
}
}
}
哪种方法更好/更差,为什么?
我问的原因是,在 Akka 中,按需构建流并不是真正有效的,因为流需要每次都实现,所以最好采用“接收器方法”。我想知道这是否也适用于反应堆,或者使用这些方法是否还有其他优点/缺点。
【问题讨论】:
标签: spring-boot reactive-programming project-reactor