转述一些 Puma 相关

最近内部项目由 Unicorn 转向 Puma,刚好手里有一本书,有一章讲到了 Puma
首先简单介绍一下:(转述)

Puma rubygem 提供了一个“专注于并发的 Ruby Web 服务器”。Puma 被设计作为由 Ruby 实现的王牌 HTTP 服务器,由于它大量倚重线程,所以并没有使用 GIL(Rubinius 或 JRuby)。Puma 的自述文件对于其适用场景给出了很好的概述,并提及了 GIL 对于线程化的影响。

1. http://puma.io/
2. https://github.com/puma/puma#description

那么 Puma 是如何实现并发的呢?(转述)

在高层上,Puma 利用线程池提供并发。主线程一直用于 accept 新的连接,然后将连接加入线程池待作处理。这便是不适用 keep-alive 的 HTTP 连接的处理方法。不过 Puma 也支持 HTTP 的 keep-alive。在处理连接时,如果首个请求要求连接保持活跃状态,那么 Puma 会尊重这一请求,不关闭连接。

3. https://en.wikipedia.org/wiki/HTTP_persistent_connection

不过这时 Puma 就不再只是 accept 这个连接了。它需要监视该连接上的新请求并进行处理。这是通过事件驱动类型的 reactor 实现的。当新的请求出现并处于保持活跃状态的连接上时,该请求会被再次加入线程池进行处理。
Puma 的请求处理总是由线程池完成的。它通过一个能够监视所有持久连接的 Reactor 实现。

最后我在此简单介绍一下 Reactor,是一种并发和联网对象模式,再具体一点是事件处理模式或者说事件驱动模式,相对简单也不算什么新技术,但风头正劲。它也是 EventMachineTwistedNode.js 以及 Nginx 等库的核心所在。事件驱动应用程序使用 Reactor 架构模式来分离并分派从一个或多个客户端发送到应用程序的服务请求,别名: DispatcherNotifier,一看别名谁都懂了!

你可能感兴趣的:(转述一些 Puma 相关)