Java 不能';t Spring Webflux或非阻塞模式不利于缩放
我明白了,如果线程是非阻塞的,我们不需要根据N个并发请求进行线程扩展,而是将任务放在反应式web编程模式中的单个事件循环中 是的,这可能会有所帮助,但由于事件循环是一个队列,如果要处理的第一个任务永远阻塞会怎么样?然后,事件循环将永远不会进行,从而结束响应和处理,而不是排队等待更多任务。是的,超时可能是可能的,但我不知道事件循环如何成为一个好的解决方案 假设您有3个任务需要3秒钟等待IO并运行每个执行,它们已提交到事件队列。然后,它们仍然需要9秒才能被处理,并在IO解析后执行。在使线程阻塞的情况下,这将在3秒钟内解决,因为它们同时运行 我可以看到的好处是,如果事件循环不是真正的队列,并且在发出任务已准备好进行处理的信号时,它会分派该任务进行处理。不过,在这种情况下,这意味着任务的执行顺序不会得到维护,而且每个任务必须仍然运行一个线程,以便能够知道IO何时被解析 也许我没有正确理解事件循环和线程处理。有人能纠正我吗,因为这种反应堆模式似乎让事情变得更糟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解析后执行。在使线程阻塞的情况
最后,在SpringReactor中执行X请求时,是否只创建1个线程来运行处理程序,而不是传统的X线程?在这种情况下,如果有人不小心编写了阻塞代码,这不意味着每个后续请求都会排队吗 对于长时间运行的任务,使用事件循环不是一个好主意。这被认为是一种反模式。通常,它仅用于快速拾取即将发生的事件,但如果工作会明显阻塞事件循环,则不会实际执行与这些事件相关的工作。您可能希望使用单独的线程池来执行长时间运行的任务。因此,事件循环通常只会使用异步的非阻塞结构启动工作(或者只在可以很快完成的情况下才实际执行工作),并将较重且可能阻塞的任务传递给单独的线程池(用于CPU密集型计算)或操作系统(例如通过网络发送的数据缓冲区) 另外,不要被只有一个线程在处理事件这一事实所愚弄,它非常快,通常足以满足要求苛刻的应用程序。像NodeJS这样的平台或像Netty这样的框架(用于Akka、Play framework、Apache Cassandra等)人们应该意识到,在事件循环中执行阻塞操作通常是个坏主意 请查看其中一些帖子以了解更多信息:
- 有点离题,但仍然是一个非常突出的例子: