转载:http://kyfxbl.iteye.com/blog/1831869
一、定义

无状态服务(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

无状态服务(stateless service)相关推荐

  1. 关于无状态服务(stateless service) 有状态服务(stateful service),指一篇文章就搞明白

    无状态服务(stateless service) 一.定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求 ...

  2. openshift_Openshift源中的高可用性Drools无状态服务

    openshift 嗨,大家好! 在这篇博客文章中,我想举一个简单的示例,展示使用Openshift 3(Docker和Kubernetes)扩展我们的Drools Stateless服务有多么容易. ...

  3. Openshift源中的高可用性Drools无状态服务

    嗨,大家好! 在这篇博客文章中,我想举一个简单的例子,展示使用Openshift 3(Docker和Kubernetes)扩展Drools Stateless服务有多么容易. 我将展示如何通过按需提供 ...

  4. 有状态服务和无状态服务

    概念 服务一般分为有状态服务(Stateful Service)和无状态服务(Stateless Service).它们的区别是,当请求发起后,服务在服务端运行时是否需要关联上下文. 有状态服务,服务 ...

  5. 高可用架构设计之无状态服务

    高可用架构设计之无状态服务 笑谈架构设计 事故的发生是量的积累的结果,任何事情都没有表面看起来那么简单,在软件运行的过程中,随着用户量的增加,不考虑高可用,迟早有一天会发生故障,不得事先考虑高可用设计 ...

  6. 干货!一文搞懂无状态服务

    来源 | 机智的程序员小熊 责编 | 寇雪芹 头图 | 下载于视觉中国 事故的发生是量的积累的结果,任何事情都没有表面看起来那么简单,在软件运行的过程中,随着用户量的增加,不考虑高可用,迟早有一天会发 ...

  7. 无状态服务和有状态服务

    对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧是指两个来自相同发起者的请求在服务器端是否具备上下文关系.如果是状态化请求,那么服务器端一般都要保存请求的相关信息,每个请求可以默认地使用 ...

  8. Kubernetes 无状态服务和有状态服务

    无状态服务 是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的. 多个实例可以共享相同的持久化数据.例如:nginx实例,tomcat实例等 相关的k ...

  9. 有状态服务 无状态服务

    一.定义: 无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息) 有状态服务 ...

最新文章

  1. 深入理解BP神经网络的细节
  2. git for c#, clone方法
  3. 【解决方案】MySQL-5.7.9 服务无法启动-“NET HELPMSG 3534”
  4. .Net设计模式_原型模式
  5. 一百馒头一百僧,大僧三个更无争,小僧三人分一个大小和尚得几丁?
  6. PHP 使用mysqli与MySQL交互
  7. 快速上手Google C++ 测试框架googletest
  8. 【报告分享】快手、抖音、视频号对比,竞争趋紧,运营体系成关键.pdf(附下载链接)...
  9. android os FileUriExposedException file storage emulated 0 test tx
  10. mockito模拟依赖注入_Mockito间谍–部分模拟
  11. 如何把Spring Boot 项目变成一个XML配置的Spring项目
  12. 连表查询 个人感觉就是根据笛卡尔积产生的数据后 每条去匹配如果 匹配成功那么就筛选出来...
  13. 驱动级鼠标模拟实现_双飞燕血手幽灵V8M Max电竞鼠标兼具功能和性价比
  14. VS2019搭建C语言开发环境(图文教程)
  15. 机器学习原理与实战 | SVM(支持向量机)实践
  16. 抖音反编译学习(记录草稿)
  17. Switch开关大调节和提示文字样式调节
  18. 两台电脑如何共享文件
  19. PHP composer作用,PHP Composer详解
  20. PMP备考经典题库-敏捷专项练习题一(30道)

热门文章

  1. Springfox-Swagger2
  2. 房贷计算器——加入UI界面(二)
  3. 【SSL_2291】分组背包
  4. 计算机英语论文中英互译,计算机专业中英文文献翻译.doc
  5. 这些西班牙品牌你真的不知道吗?
  6. BUUCTF-Reverse reverse1
  7. erlang mysql:start_link_Erlang OTP之terminate 深入分析
  8. 想学IT的必看!如何才能通过一线互联网公司面试?面试必问
  9. oracle存储过程ddl,Oracle 存储过程中的DDL语句
  10. MySQL基础之DDL语句