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数据库