Erlang cowboy http request生命周期

翻译自:

http://ninenines.eu/docs/en/cowboy/1.0/guide/http_req_life/

request的生命周期

本章解释服务器response之前的http request的步骤,以及cowboy实现的细节。

Request/response

正如你了解到的,HTTP客户端连接到服务器,发送资源请求(request),服务器发送响应(response),其中包含可以获取到的资源。

在服务器发送资源之前,它需要一些步骤去读请求,找出资源,准备发送资源,还包括其他关联的操作,如写日志等。

在cowboy中,请求按下图路由:

本图显示了默认的处理中间件(middlewares),可以被设置成不同的方式。深绿色(双框)标明了用户可以插入(hook)自己实现的代码点。浅绿色是cowboy代码,可以根据需要设置。

acceptor是服务器的一部分,它接受连接,然后创建一个Erlang进程处理它。

parser接着开始读取socket连接,当请求到来时处理之,直到socket关闭。

在请求的整个周期中,可以在多个地方返回响应。如果cowboy不能解析请求,它会结束处理返回错误。如果路由router不能找到资源,它会返回not found错误。你自己的代码在任何时候都可以返回响应。

当响应被发送,你可以选择修改它,或者在onresponse的回调中实现代码。默认,响应被直接发送给客户端。

And then?

具体的行为依赖采用的协议。

HTTP/1.0 仅仅能一个连接处理一个请求,因此Cowboy在发送响应之后立即关闭连接。

HTTP/1.1 允许客户端请求服务端并保持这个连接。这个机制下面会说明。

SPDY 用于在同一个连接上发送多个异步请求,详见下面。

Keep-alive (HTTP/1.1)

在HTTP/1.1协议中,连接可以一直被打开,并连续发生请求。这种机制称为keep-alive

当客户端发送请求到服务端,它包含一个头,标识是否需要保持连接打开状态。服务端可以接受,也可以不接受,同样在响应的头部中返回它的选择。

对 HTTP/1.1 requests,Cowboy自动在所有响应中包含这个头部。如果你愿意也可关闭socket连接。 当 Cowboy 看到你设置了connection: close头,它不会覆盖你的设置,当响应被发送,就会关闭连接。

下面的代码强迫Cowboy关闭连接:

{ok, Req2} = cowboy_req:reply(200, [
    {<<"connection">>, <<"close">>},
], <<"Closing the socket in 3.. 2.. 1..">>, Req).

Cowboy在同一个连接上仅仅接受一定数目的请求,默认是100个请求。当启动一个HTTP监听时,这个数目可以按下面的方法改变(max_keepalive):

cowboy:start_http(my_http_listener, 100, [{port, 8080}], [
        {env, [{dispatch, Dispatch}]},
        {max_keepalive, 5}
]).

Cowboy通过为所有请求重用同一个进程来实现保活keep-alive。这样Cowboy就可以节省内存。这种方式能够起作用,因为多数代码对后续请求没有副作用。但是同时也意味如果你的代码存在副作用,就必须做清理工作,terminate/3函数就是干这个的。

Pipelining (HTTP/1.1)

HTTP是一种顺序化的协议,客户端发送请求,然后等待服务端响应。由于sockets的工作模式,http不会阻止客户发送更多的请求,不会强迫客户等待响应。服务器仍然按顺序地处理请求,按同样的次序返回响应。

这种机制称为pipelining。当客户在一个时间内请求更多的资源时能减少延时,例如,这种方式被浏览器请求静态文件时使用。

这种模式被服务器自动处理。

异步请求 requests (SPDY)

在SPDY,客户可以在任何时间发送请求,服务也是可以在任何时候返回响应。这意味着客户端不必等待请求被完全发送就可以发另一个请求,这样交织发送请求就成为可能。同样也适合服务端。响应也可以用不同的次序发送。

因为请求和响应是完全异步的,Cowboy为每个请求创建一个新的进程,这些进程被另一个处理连接的进程管理。SPDY服务也可以决定是否在请求之前发送资源给客户,这种方式对发送与HTML页面关联的静态文件特别有用,因为减少了响应延时。但是,当前Cowboy不支持这种机制。

Erlang cowboy http request生命周期的更多相关文章

  1. node.js WebService异常处理(domain)以及利用domain实现request生命周期的全局变量

    成熟的Web Service技术,例如Fast CGI.J2EE.php,必然会对代码异常有足够的保护,好的Web必然会在出错后给出友好的提示,而不是莫名其妙的等待504超时.而node.js这里比较 ...

  2. SpringMVC request生命周期

    When the request leaves the browser, it carries information about what the user is asking for. At ve ...

  3. javaBean Request生命周期

    request: 在request范围内,JavaBean对象的有效范围为: ① 客户请求访问的当前JSP页面② 和当前JSP页面共享同一个请求的页面,包括<%@ include%>指令以 ...

  4. MVC Request生命周期(综合总结)

    当用户在浏览器输入一个URL地址后,浏览器会发送一个请求到服务器.这时候在服务器上第一个负责处理请求的是IIS.然后IIS再根据请求的URL扩展名将请求分发给不同的处理程序处理. 流程如下: 当请求一 ...

  5. Request和Session的生命周期

    request的生命周期是request请求域,一个请求结束,则request结束 session的生命周期是session会话域,打开一个浏览器请求一个网站的页面后,Session开始,当sessi ...

  6. JAVA CDI 学习(2) - Scope 生命周期

    在上一节中,我们已经知道了如何用@Inject实现基本注入,这一节研究Bean实例注入后的“生命周期”,web application中有几种基本的生命周期(不管哪种编程语言都类似) 1.Applic ...

  7. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. Request Session生命周期及struts1 中service的编写

    现在接手的项目是一个早期的struts1框架的项目.同时也是刚开始接触web 以及struts1架构. 在处理多个action时,有一个tab子页面需要每5s自动刷新一次. 然后在测试过程中发现,点击 ...

  9. laravel中的$request对象构造及请求生命周期

    laravel应用程序中index.php是所有请求的入口.当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据, 生成一个request对象 ...

随机推荐

  1. x264源代码简单分析:熵编码(Entropy Encoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  2. Dynamics CRM 站点地图中URL的&号编码问题

    现在大多数人对站点地图的操作都通过工具来执行,但如果你使用原始的编辑XML方式,并且你的SubArea中对应的不是某个Entity而是一串URL时,要注意了你的URL中如果带有与符号即&,那就 ...

  3. 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...

  4. [ExtJS5学习笔记]第二十一节 Extjs5中使用config配置给ext.widget或者create方法传递参数

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39252805 官方例子:http://docs.sencha.com/extjs/5. ...

  5. Xcode中不用Storyboard,用纯xib创建TabBar模式视图

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 如果要开发Tab类型视图的App,在Xcode中可以使用对应的 ...

  6. 文件操作(File类等)API摘要

    Console 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有). 虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式.如果虚拟机从一个交互式命令行开始启 ...

  7. SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  8. Java进阶(三十三)java基础-filter

    java基础-filter 我们先看看没有filter的时候,整个web客户端-服务端的一个流程. 接下来我们再看看引入了filter之后的Uml图.尝试分析这两者之间的差别. filter从哪里来? ...

  9. Spark SQL官方文档阅读--待完善

    1,DataFrame是一个将数据格式化为列形式的分布式容器,类似于一个关系型数据库表. 编程入口:SQLContext 2,SQLContext由SparkContext对象创建 也可创建一个功能更 ...

  10. Unity插件 - MeshEditor(一) 3D线段作画 & 模型网格编辑器

    之前,因为工作需要,项目中需要动态生成很多的电线,不能事先让模型做好,更不能用LineRenderer之类的,因为画出来没有3D的效果,最主要是拐角的时候还容易破面,而我们要的是真真实实纯3D的电线, ...