无状态服务(stateless service)

1、定义 

无状态服务(stateless service)对单次请求的处理,不依赖其余请求,也就是说,处理一次请求所需的所有信息,要么都包含在这个请求里,要么能够从外部获取到(好比说数据库),服务器自己不存储任何信息 

有状态服务(stateful service)则相反,它会在自身保存一些数据,前后的请求是有关联的 

2、优劣 

有状态服务经常用于实现事务(并非惟一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。须要通过放入购物车、确认订单、付款等多个步骤。因为HTTP协议自己是无状态的,因此为了实现有状态服务,就须要经过一些额外的方案。好比最多见的session,将用户挑选的商品(购物车),保存到session中,当付款的时候,再从购物车里取出商品信息 

有状态服务能够很容易地实现事务,因此也是有价值的。可是常常听到一种说法,即server要设计为无状态的,这主要是从可伸缩性来考虑的。若是server是无状态的,那么对于客户端来讲,就能够将请求发送到任意一台server上,而后就能够经过负载均衡等手段,实现水平扩展。若是server是有状态的,那么就没法很容易地实现了,由于客户端须要始终把请求发到同一台server才行,所谓“session迁移”等方案,也就是为了解决这个问题 

 

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、无状态类 

引伸一下,JAVA里有一种类的设计,能够称为无状态类。这种类的特征是只有方法没有字段,在三层架构(展示层、逻辑层、持久层)里,逻辑层常常能够看到这种类 
我以为无状态类和stateless server在思想上是同样的,这个类自己是没有状态的,因此当外部要调用它的方法时,须要在方法参数中传来所需的全部信息,不依赖该类自身的状态(字段值),在并发环境下,能够避免多线程带来的反作用 

7、总结 

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

关于这个话题,下面这个连接也不错: 
http://stackoverflow.com/questions/4495950/how-do-stateless-servers-work数据库

相关文章
相关标签/搜索