有状态服务和没状态服务和keepalive

服务的有状态和无状态

    对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧——两个来自相同发起者的请求在服务器端是否具备上下文关系。

    状态化请求,服务器端一般都要保存请求的相关信息,每个请求可以默认地使用以前的请求信息。

    无状态请求,服务器端所能够处理的过程必须全部来自于请求所携带的信息,以及其他服务器端自身所保存的、并且可以被所有请求所使用的公共信息。

一、比较 

    有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。

    由于HTTP协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的session,将用户挑选的商品(购物车),保存到session中,当付款的时候,再从购物车里取出商品信息   

    服务要设计为无状态的,这主要是从可伸缩性来考虑的。

    如果server是无状态的,那么对于客户端来说,就可以将请求发送到任意一台server上,然后就可以通过负载均衡等手段,实现水平扩展。

    如果server是有状态的,那么就无法很容易地实现了,因为客户端需要始终把请求发到同一台server才行,所谓“session迁移,seesion共享”等方案,也就是为了解决这个问题

    image.png

二、简单来说

      基于session和cookie都可以实现事务,可以认为,session是有状态的,而cookie是无状态的 


三、什么是keepalive

     image.png

          keepalive是tcp连接中的会话保持的一种机制,链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。


四、详解nginx timeout参数如何配置


client_body_timeout 指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。 一般配置为 client_body_timeout 20s;
client_header_timeout  客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。一般配置为 client_header_timeout 10s;
send_timeout  服务端向客户端传输数据的超时时间。一般配置为 send_timeout 30s;
keepalive_timeout   Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接。一般配置为 keepalive_timeout 60s;
resolver_timeout  该指令设置DNS解析超时时间 一般配置为 resolver_timeout 5s;
proxy_connect_timeout  该指令设置与upstream server的连接超时时间,有必要记住,这个超时不能超过75秒。这个不是等待后端返回页面的时间,那是由proxy_read_timeout声明的。如果你的upstream服务器起来了,但是hanging住了(例如,没有足够的线程处理请求,所以把你的请求放到请求池里稍后处理),那么这个声明是没有用的,由于与upstream服务器的连接已经建立了。一般配置为和keepalive_timeout一致 proxy_connect_timeout 60s;
proxy_read_timeout 该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间.一般配置为proxy_read_timeout 60s;
proxy_send_timeout 这个指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接; 一般配置为 proxy_send_timeout 60s;
proxy_upstream_fail_timeout  Upstream模块下 server指令的参数,设置了某一个upstream后端失败了指定次数(max_fails)后,该后端不可操作的时间,默认为10秒;一般配置为proxy_upstream_fail_timeout 3s;


五、总结

    nginx 优化参数需要根据具体的应用和实际的情况来进行调整,例如有状态服务需要使用keepalive,无状态服务需要使用keepalive。



猜你喜欢

转载自blog.51cto.com/8341475/2162211