服务的有状态和无状态

服务的有状态和无状态 数据库

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

状态化请求,服务器端通常都要保存请求的相关信息,每一个请求能够默认地使用之前的请求信息。cookie

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

1、比较负载均衡

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

因为HTTP协议自己是无状态的,因此为了实现有状态服务,就须要经过一些额外的方案。好比最多见的session,将用户挑选的商品(购物车),保存到session中,当付款的时候,再从购物车里取出商品信息优化

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

若是server是无状态的,那么对于客户端来讲,就能够将请求发送到任意一台server上,而后就能够经过负载均衡等手段,实现水平扩展设计

若是server是有状态的,那么就没法很容易地实现了,由于客户端须要始终把请求发到同一台server才行,所谓_“session迁移”_等方案,也就是为了解决这个问题3d

3、session和cookie

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

4、无状态实现事务的方法

并非必定要用有状态服务才能实现事务,本文提供另外的几种方案做为参考
举一个屡次提交的场景做为例子:用户须要提交不少数据,分为2个页面提交

这里就涉及到2次http请求,第一次提交字段一、二、3,第二次提交字段四、五、6

用session很容易实现这个需求,server只须要将第一次提交的数据,保存在session里,而后返回第2个表单做为相应;而后取出第一次提交的数据,和第二次提交的数据汇聚之后,一块儿存入数据库便可

不用session一样也能够实现,server接收到第一次请求之后,将数据做为隐藏元素,放在第2个表单里返回;这样用户第2次提交的时候,就隐含地再次提交了第一次的数据;server将全部数据存入数据库
用HTML5,则还能够进一步优化,client能够将第一次提交的数据,保存在sessionStorage里
用cookie也是相似的道理,一样能够实现,可是不太好

总的来讲,3种替代方案(隐藏表单元素、sessionStorage、cookie)都避免了在server端暂存数据,从而实现了stateless service。本质上,这3种方案的请求里,都包含了全部必须的数据,符合本文一开始的定义

5、将有状态服务转换成无状态服务

根据本文一开始的定义,除了将全部信息都放在请求里以外,还有另一种方法能够实现无状态服务,即将信息放在一个单独可共享的地方,独立于server存在
好比,一样仍是采起session的方式,在服务端保存数据,减小每次client请求传输的数据量(节省流量),可是将session集中存放,好比放在单独的session层里。这种状况下,server一样是无状态的,能够作水平扩展

6、总结
有状态服务能够比较容易地实现事务,在不须要考虑水平扩展时,是比较好的选择
无状态服务的优点在于能够很方便地水平伸缩,可是在实现事务时,须要作一些额外的动做
能够经过剥离session等方法,将一个有状态服务,转换成无状态服务

注:什么是事务?

事务,就是把一堆事情绑在一块儿作,都成功了才算完成,不然就恢复以前的样子。
举例:银行ATM取钱,扣款成功后忽然大停电,吐钱的操做还没作,这时候就要恢复没取钱时候的状态,不然钱扣了还没拿到手,多冤枉

转载:http://kyfxbl.iteye.com/blog/...

相关文章
相关标签/搜索