java-无法通过spring web reacting显示背压
作者:互联网
我正在尝试使用spring-web-active来显示背压,就像在akka中显示它的方式-https://www.youtube.com/watch?v=oS9w3VenDW0
(在28:20至29:20之间观看).
要尝试一下,我使用了以下来自github https://github.com/bclozel/spring-boot-web-reactive的示例项目
设置项目后,我在HomeController.java中添加了一个新端点,如下所示:
@RequestMapping(value = "/longflux",produces = "application/stream+json")
public Flux<Long> longFlux(){
return Flux.interval(Duration.ofMillis(10)).log();
}
现在,如果我尝试卷曲该端点,然后使用(CTRL z)将其挂起,则应在tcp缓冲区已满时立即施加反压,并且服务器应停止发出事件.
但是,在一段时间后挂起curl命令会引发以下异常:
2017-02-16 08:49:48.480 ERROR 3500 --- [ timer-1] reactor.Flux.Interval.4 : one rror(reactor.core.Exceptions$OverflowException: Could not emit value 2578 due to lack of requests)
2017-02-16 08:49:48.481 ERROR 3500 --- [ timer-1] reactor.Flux.Interval.4 :
reactor.core.Exceptions$OverflowException: Could not emit value 2578 due to lack of requests
at reactor.core.Exceptions.failWithOverflow(Exceptions.java:151) ~[reactor-core-3.0.4.RELEASE.jar:3.0.4.RELEASE]
at reactor.core.publisher.FluxInterval$IntervalRunnable.run(FluxInterval.java:98) ~[reactor-core-3.0.4.RELEASE.jar:3.0.4.RELEASE]
at reactor.core.scheduler.SingleTimedScheduler$TimedPeriodicScheduledRunnable.run(SingleTimedScheduler.java:394) ~[reactor-core-3.0.4.RELEASE.jar:3.0.4.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_121]
我无法理解为什么在curl命令被挂起后,请求会在异常终止的情况下终止(在spring-web-active实现中),而在akka示例(如youtube链接所示)中,一旦TCP缓冲区已满.
解决方法:
Flux.interval是一种特殊情况,因为它是一个热源,而且Reactor不会缓冲时间.这意味着如果您的请求周期由于背压而变慢并且您的间隔源产生得更快,Reactor将发出错误信号.
您可以使用.onBackpressureDrop()运算符更新此示例,以在出现背压时降低间隔.这应该符合预期.
有很多方法可以说明背压,包括:
>使用延迟运算符延迟订阅
>模拟多个慢客户端(带宽和延迟)
标签:project-reactor,spring-webflux,spring,java 来源: https://codeday.me/bug/20191026/1934997.html