文档章节

无状态服务(stateless service)

商者
 商者
发布于 2017/07/25 20:18
字数 1276
阅读 7
收藏 0

一、定义 

无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息 

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

二、优劣 

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

有状态服务可以很容易地实现事务,所以也是有价值的。但是经常听到一种说法,即server要设计为无状态的,这主要是从可伸缩性来考虑的。如果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同样是无状态的,可以做水平扩展 

六、无状态类 

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

七、总结 

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

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

 

 

本文转载自:http://kyfxbl.iteye.com/blog/1831869

共有 人打赏支持
商者

商者

粉丝 42
博文 141
码字总数 43255
作品 0
海淀
架构师
私信 提问
有状态、无状态(Stateful and Stateless)

1.精通有状态vs无状态(Stateful vs Stateless) Spring中的有状态(Stateful)和无状态(Stateless) 1>. 无状态的Bean适合用不变模式,技术就是单例模式,这样可以共享实例,提高性能。有状态的B...

一个蛋定倒,拔腿就跑
2012/03/13
0
0
领域驱动之无状态操作

这段时间一直在看DDD的东西,对domain层说到: domain service领域服务里是无状态stateless的操作 所有的状态stateful应该都在聚合根aggregate里 一个经典的带状态的类/服务是一个可以增加近...

BuWStudio
2016/12/02
33
0
J2EE面试题之二

一、基础问答   1.下面哪些类可以被继承?    java.lang.Thread (T)    java.lang.Number (T)    java.lang.Double (F)    java.lang.Math (F)    java.lang.Void (F)    ...

zting科技
2017/08/11
0
0
spring的service注入是singleton的。

不要再singleton的service采用私有变量记录信息,多线程会共享到这个变量值。 service应该是stateless才行。

jing31
2010/11/26
0
0
RESTful Web Service的一些新体会

REST - Representational State Transfer 其实这个representational是指Resource的representation Resource其实就是实体,ReST中所有的对象都被视为Resource。每一个Resource都有一个URI(U...

Mybbz
2014/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
3
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
6
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
6
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
5
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部