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. TCP协议的性能评测工具 — Tcpdive开源啦

    Github地址:https://github.com/fastos/tcpdive 为什么要开发Tcpdive 在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化. 用户 ...

  2. Redis工作系列之一 与 Memcached对比理解

         近期公司项目在使用Redis,这几年Redis很火,Redis也常常被当作Memcached的挑战者被提到桌面上来.关于Redis与Memcached的比较更是比比皆是.然而,Redis真的 ...

  3. 关于Windows下程序执行的说明

    估计有很多人首次都是通过Windows(微软的操作系统)来使用计算机的,Windows的设计导致很多人认为所有程序只要双击一下就可以被正确执行了,所以一大堆初学程序设计的童鞋就会遇到些疑问: 为什么双 ...

  4. UE4读取本地XML文件

    其实这里读取XML也是利用了Tinyxml来读取xml,主要是讲Tinyxml放在UE4中,遇到的一点点坑 1.先给出Tinyxml链接:http://www.grinninglizard.com/t ...

  5. Android开发_TextView跑马灯

    关键代码: android:singleLine="true" android:ellipsize="marquee" android:focusable=&q ...

  6. javascript中的XML

    IE下创建DOM并载入XML var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.load(url); //载入X ...

  7. 插件开发之360 DroidPlugin源码分析(二)Hook机制

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52124397 前言:新插件的开发,可以说是为插件开发者带来了福音,虽然还很多坑要填补, ...

  8. 01 Android修改新建虚拟机存放的位置

    创建的Android虚拟机(即AVD)的位置是在C盘的当前用户文件夹下(C:\Users\用户名\.android\avd) 这一默认设置不怎么好,特别是C盘空间吃紧的话. 这里提供2个解决办法(分2 ...

  9. Ext JS 6开发实例(三) :主界面设计

    在上文中,已经将CMD创建的应用程序导入到项目里了,而且也看到默认的主界面了,今天的主要工作就是修改这个主界面,以符合项目的需要.除了设计主界面,还有一些其他的东西需要配置一下. 添加本地化包 打开a ...

  10. (八十八)VFL语言初步 - 实现布局

    [基本语法] VFL的语法为H:和V:开头,代表水平和垂直. 接下来如果要涉及距离,使用|-x-,x为距离的点数. 对于视图,用[ ]包围,例如[blueView]. ①下面的语句实现了blueVie ...