这意味着,例如,模块可以 开始压缩来自a的响应 后端服务器并将其流式传输到 模块收到之前的客户端 来自后端的整个响应。 尼斯!
我知道它是某种异步IO,但这样的简单还不够。
有谁知道?
答案 0 :(得分:1)
不看实际实现的源代码,我在这里推测:
最有可能是某种流(抽象缓冲IO)从一个模块传递到另一个模块(“链接”)。一个模块(可能是一个servlet容器)写入另一个模块(在您的示例中为压缩模块)读取的流,然后将其输出写入另一个流。然后可以进一步处理该流的内容或将其发送到客户端。
答案 1 :(得分:0)
后端可能需要等待IO才能完全生成页面。模块可以在后端完全写入之前开始压缩消息的开头。
要了解这有用的原因,您需要了解ngnix的结构。 ngninx是依赖于非阻塞输入和输出的服务器。通常,服务器将使用阻塞输入和输出:它将侦听连接,并且当找到连接时,它将处理页面。为了增加吞吐量,产生了多个线程,称为“工作者”。
将此与ngnix进行对比:它不断询问内核,“我的IO请求是否准备就绪?”这允许它处理相同数量的页面,1)减少来自所有不同进程的开销,以及2)较低的内存使用。然而,它有一些缺点。对于极小量的应用程序,ngnix可能使用比阻塞服务器更多的CPU。其次,它的便携性要低得多。 Windows对非阻塞IO使用完全不同的模型。
回到原来的问题,压缩页面的开头很有用,因为当它完成访问数据库或从磁盘读取或者你有什么内容时,它可以为页面的其余部分做好准备。