浅谈无状态和有状态服务的区别

Posted hxm-35-simle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈无状态和有状态服务的区别相关的知识,希望对你有一定的参考价值。

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

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

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

一、比较

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

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

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

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

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

技术图片

 

三、session和cookie

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

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

并不是一定要用有状态服务才能实现事务,本文提供另外的几种方案作为参考

举一个多次提交的场景作为例子:用户需要提交很多数据,分为2个页面提交

技术图片

 

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

用session很容易实现这个需求,server只需要将第一次提交的数据,保存在session里,然后返回第2个表单作为相应;然后取出第一次提交的数据,和第二次提交的数据汇聚以后,一起存入数据库即可

不用session同样也可以实现,server接收到第一次请求以后,将数据作为隐藏元素,放在第2个表单里返回;这样用户第2次提交的时候,就隐含地再次提交了第一次的数据;server将所有数据存入数据库

html5,则还可以进一步优化,client可以将第一次提交的数据,保存在sessionStorage里

用cookie也是类似的道理,同样可以实现,但是不太好

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

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

根据本文一开始的定义,除了将所有信息都放在请求里之外,还有另外一种方法可以实现无状态服务,即将信息放在一个单独可共享的地方,独立于server存在

比如,同样还是采取session的方式,在服务端保存数据,减少每次client请求传输的数据量(节省流量),但是将session集中存放,比如放在单独的session层里。这种情况下,server同样是无状态的,可以做水平扩展

技术图片

 

六、总结

有状态服务可以比较容易地实现事务,在不需要考虑水平扩展时,是比较好的选择

无状态服务的优势在于可以很方便地水平伸缩,但是在实现事务时,需要做一些额外的动作

可以通过剥离session等方法,将一个有状态服务,转换成无状态服务

注:什么是事务?

事务,就是把一堆事情绑在一起做,都成功了才算完成,否则就恢复之前的样子。

举例:银行ATM取钱,扣款成功后突然大停电,吐钱的操作还没做,这时候就要恢复没取钱时候的状态,否则钱扣了还没拿到手,多冤枉。

以上是关于浅谈无状态和有状态服务的区别的主要内容,如果未能解决你的问题,请参考以下文章

[react] 描述下在react中无状态组件和有状态组件的区别是什么?

浅谈无参数RCE[未完

浅谈ElementUI中switch回调函数change的参数问题

浅谈无字母数字构造webshell

浅谈session,cookie,sessionStorage,localStorage的区别及应用场景

浅谈session,cookie,sessionStorage,localStorage的区别及应用场景