Cowboy 用户指南 (五) - Flow diagram

流程图

Cowboy是一个轻量级的HTTP服务器,支持HTTP/1.1、HTTP/2和Websocket。

它建立在Ranch的基础上。有关如何处理网络连接的更多信息,请参阅Ranch指南。

Overview

HTTP request/response flowchart

正如您在图中看到的,客户端首先连接到服务器。这个步骤由Ranch acceptor处理,这是一个专门用于接受新连接的进程。

Ranch接受新连接后,无论是HTTP/1.1还是HTTP/2连接,Cowboy都会开始接收并处理请求。

在HTTP/1.1中,所有的请求都是顺序来的。在HTTP/2中,请求可以到达并并发处理。

当请求传入时,Cowboy创建一个流(stream),这是一组request/response以及与之相关的所有事件。Cowboy中的协议代码将这些流的处理延迟到流处理程序模块。配置Cowboy时,可以定义一个或多个模块,接收与流相关的所有事件,包括请求、响应、正文、Erlang消息等等。

默认情况下,Cowboy配置了一个称为cowboy_stream_h的流处理程序。这个流处理程序将为每个传入的请求创建一个新进程,然后与这个进程通信以读取正文或发回响应。请求进程执行中间件(默认情况下,包括路由器和处理程序的执行)。像流处理程序一样,中间件也可以自定义。

在这个图中几乎任何点都可以发送响应。如果响应必须在流初始化之前发送(例如,因为早期发生了错误),那么流处理程序将接收一个特殊的事件来说明此错误。

特殊协议报头

Cowboy负责处理特殊协议报头,并阻止您手动发送它们。对于HTTP/1.1,这包括传输编码和连接头。对于HTTP/2,这包括冒号头:status。

在将特殊协议报头传递给流处理程序之前,Cowboy还将从请求中删除特殊协议报头。Cowboy试图尽可能地隐藏所有协议的实现细节。

每个连接的进程数

默认情况下,Cowboy将为每个连接使用一个进程,加上每个请求/响应集(在内部称为流)使用一个进程。  (一共2进程,流进程处理完消息后剩下一个连接进程)

By default, Cowboy will use one process per connection, plus one process per set of request/response (called a stream, internally).

它为每个请求创建一个新进程的原因是由于HTTP/2的要求,在HTTP/2中,请求是并发执行的,并且独立于连接。来自不同请求的帧在单一的TCP连接上交叉结束。

The reason it creates a new process for every request is due to the requirements of HTTP/2 where requests are executed concurrently and independently from the connection. The frames from the different requests end up interleaved on the single TCP connection.

请求进程永远不会被重用。因此,在发送响应后额外不需要执行任何清理。进程将会被终止,Erlang/OTP将一次性回收所有内存。

The request processes are never reused. There is therefore no need to perform any cleanup after the response has been sent. The process will terminate and Erlang/OTP will reclaim all memory at once.

最终,每个连接不需要多于一个进程。它可以直接通过流处理程序与连接交互,这是Cowboy的一个低级接口。它们从连接进程中执行,并可以处理传入的请求和发送响应。但是,在正常情况下不建议这样做,因为流处理程序执行时间过长可能会对并发请求或连接本身的状态产生负面影响。

日期报头

由于查询当前日期和时间的开销很大,因此Cowboy每秒钟生成一个日期报头,将其共享给所有其他进程,然后这些进程将其复制到响应中。这允许遵循HTTP/1.1,而没有实际的性能损失。

二进制文件

Cowboy广泛使用二进制文件。

二进制比列表更有效地表示字符串,因为它们占用的内存空间更少。处理性能可能因操作而异。众所周知,如果代码是本机编译的,二进制代码通常会得到很大的提升。请参阅HiPE文档了解更多细节。

二进制文件最终可能会在进程之间共享。当一个进程永远保留二进制数据而不释放它时,这可能会导致一些较大的内存使用量。如果您在应用程序中看到一些奇怪的内存使用,这可能是原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值