板条箱文档路线图推文
portunusd是一款受OpenBSD relayd和Heirloom Unix inetd启发的网络应用程序服务器。它会听取传入的网络连接,将传入的数据转发到Illumos门上,并以类似的方式返回响应。 portunusd将每个连接的端口映射到目标应用程序提供的文件系统上的门上。
测序图
参与者客户
参与者Portunusd
参与者的门
参与者申请
应用程序 - >>门:创建/var/run/app.door
Portunusd- >>门:打开
Portunusd- >> Portunusd:在端口80上听
循环处理请求
客户端 - >>+portunusd:发送HTTP请求
portunusd- >>+应用程序:通过door_call转发请求
应用程序 - >> - portunusd:通过door_return发送响应
Portunusd- >> - 客户端:发送HTTP响应
结尾
portunusd的主要目标是促进单线程应用程序的缩放。在inetd模型下,创建了一个新的过程来处理每个请求。通过利用门,只有在达到新的并发标记时, portunusd才能在应用程序过程中创建一个新线程;否则,将重新使用现有线程以处理后续请求。
我们希望面向网络的应用程序根据用户需求进行扩展。我们希望在闲置时最大程度地降低应用程序的资源成本,并且我们希望在需求方面保持成本线性。我们希望最大程度地降低应用程序开发人员负责资源管理的程度,并且我们希望(尽可能多地)保留UNIX命令行工具的熟悉开发环境。
以轨道为例,在Rails应用程序上进行单线读红宝石可以一次处理一个用户请求。如果没有在内存中驻留多个应用程序(在单独的Ruby口译员上),就无法处理多个同时请求。即使用户需求很少,该模型也会消耗大量内存,从而使主机难以运行其他工作负载。随后将进行大量的分页和齿状磁盘。
Node.js之类的环境通过使异步性更加透明,以解决此问题。尽管接受计算机的异步性可能很有用,但它也引入了支持它的语言的更改。这仅仅是语法的变化,而是人们用来读取,写作和理解程序的心理模型的非平凡变化。
在频谱的另一端,CGI应用程序需要每个请求的唯一过程和地址空间。这些应用程序可以随用户需求线性扩展,包括在空闲时缩放到零内存 / CPU使用情况,但是调用execv(2)的每个请求的成本可能会妨碍吞吐量。
后现代的“无服务器”方法满足了这些条件,但以放弃操作系统为代价。这是开发软件的一种非常陌生的方法,并丢弃了许多可以在运行时观察和调试应用程序的工具。
门启用网络应用程序开发的新(旧?)模型,其中开发人员负责维护和理解线性,同步任务,而操作系统 + Web服务器在缩放问题上共同使用
这些质量使我们能够通过开发感觉像单线读取Unix命令行工具的网络应用程序来解决我们的问题声明,在空闲时呈现最小的费用,并在每次要求粒度上线性扩展。
当然,单独的门不能处理单个操作系统实例的边界上的缩放,但是假设该应用程序的副本可在多个主机上获得,则与防火墙的中继式合作可以促进这一点。这是portunusd进来的地方。
社交媒体预览图像是劳顿·多德(Loudon Dodd) - 自己的作品,CC BY -SA 3.0。
@jasonbking回答了许多晦涩的光明 /锈 /门问题。