Java 不能';t Spring Webflux或非阻塞模式不利于缩放

Java 不能';t Spring Webflux或非阻塞模式不利于缩放,java,spring,spring-boot,reactive-programming,project-reactor,Java,Spring,Spring Boot,Reactive Programming,Project Reactor,我明白了,如果线程是非阻塞的,我们不需要根据N个并发请求进行线程扩展,而是将任务放在反应式web编程模式中的单个事件循环中 是的,这可能会有所帮助,但由于事件循环是一个队列,如果要处理的第一个任务永远阻塞会怎么样?然后,事件循环将永远不会进行,从而结束响应和处理,而不是排队等待更多任务。是的,超时可能是可能的,但我不知道事件循环如何成为一个好的解决方案 假设您有3个任务需要3秒钟等待IO并运行每个执行,它们已提交到事件队列。然后,它们仍然需要9秒才能被处理,并在IO解析后执行。在使线程阻塞的情况

我明白了,如果线程是非阻塞的,我们不需要根据N个并发请求进行线程扩展,而是将任务放在反应式web编程模式中的单个事件循环中

是的,这可能会有所帮助,但由于事件循环是一个队列,如果要处理的第一个任务永远阻塞会怎么样?然后,事件循环将永远不会进行,从而结束响应和处理,而不是排队等待更多任务。是的,超时可能是可能的,但我不知道事件循环如何成为一个好的解决方案

假设您有3个任务需要3秒钟等待IO并运行每个执行,它们已提交到事件队列。然后,它们仍然需要9秒才能被处理,并在IO解析后执行。在使线程阻塞的情况下,这将在3秒钟内解决,因为它们同时运行

我可以看到的好处是,如果事件循环不是真正的队列,并且在发出任务已准备好进行处理的信号时,它会分派该任务进行处理。不过,在这种情况下,这意味着任务的执行顺序不会得到维护,而且每个任务必须仍然运行一个线程,以便能够知道IO何时被解析

也许我没有正确理解事件循环和线程处理。有人能纠正我吗,因为这种反应堆模式似乎让事情变得更糟


最后,在SpringReactor中执行X请求时,是否只创建1个线程来运行处理程序,而不是传统的X线程?在这种情况下,如果有人不小心编写了阻塞代码,这不意味着每个后续请求都会排队吗

对于长时间运行的任务,使用事件循环不是一个好主意。这被认为是一种反模式。通常,它仅用于快速拾取即将发生的事件,但如果工作会明显阻塞事件循环,则不会实际执行与这些事件相关的工作。您可能希望使用单独的线程池来执行长时间运行的任务。因此,事件循环通常只会使用异步的非阻塞结构启动工作(或者只在可以很快完成的情况下才实际执行工作),并将较重且可能阻塞的任务传递给单独的线程池(用于CPU密集型计算)或操作系统(例如通过网络发送的数据缓冲区)

另外,不要被只有一个线程在处理事件这一事实所愚弄,它非常快,通常足以满足要求苛刻的应用程序。像NodeJS这样的平台或像Netty这样的框架(用于Akka、Play framework、Apache Cassandra等)人们应该意识到,在事件循环中执行阻塞操作通常是个坏主意

请查看其中一些帖子以了解更多信息:

  • 有点离题,但仍然是一个非常突出的例子:

您好xSRNG,对有用的链接和反模式确认投了赞成票。但是,只要您能解释“只有在任务不阻塞事件循环的情况下,事件循环才是强大的……非常适合处理异步I/O,这是Spring Reactor的核心。”在我的问题中,我已经说明了,在处理异步I/O时,为了听到I/O已经完成,需要一个单独的线程来监听它。但是在阅读了您的链接之后,NIO似乎可以使用在较低级别处理的通道(没有线程).是这样吗?我这么说是因为在Java NIO中,在一个线程上运行的选择器可以处理多个通道。我试图对上面的文本添加一些解释,直到我意识到我可以编写更多关于这个主题的文本。相反,我又添加了两个链接“Unix网络编程”这几乎是我们讨论的所有框架的基础(java Nio、NETY、Webflux等)和“Kotlin Webflux”,我认为这是一个很好的文本,祝你们好运。-谢谢你们的努力!如果你决定写一篇,你就知道我读了所有的,再次感谢!你的问题是关于SpringReactor还是事件循环?两者都是因为SpringReactor使用事件循环。你们从哪里得到这些信息的?“WebFlux堆栈在一个事件循环模型中提供完全无阻塞的I/O。”据我所知,但WebFlux不是反应堆。