这个知识点不错,,学习一下先。。。无状态服务(stateless service)(转)

这样的应用,显得高级一些哟~~:)

+==================

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

 

时间: 2024-09-20 00:18:59

这个知识点不错,,学习一下先。。。无状态服务(stateless service)(转)的相关文章

无状态服务(stateless service)

一.定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息 有状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的 二.优劣 有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案).举一个常见的例子,在商城里购买一件商品.需要经过放入购物车.确认订单.付款等多个步骤.由于HTTP协议本身是

无状态Enterprise JavaBeans的观点

在Component-Base和N-Tier潮流下,无状态(stateless)物件扮演着重要的角色.stateless物件是 OO 和Transaction Service两项技术结合的产物.OO 技术强调的是弹性(felxibility).重用性(reusability)和分散性(distribution),Transaction Service技术强调的是效率(performance)和延展性(scalability). Stateless物件是这两项技术结合的重要支柱. 传统的OO技术大

有状态的EJB对象和无状态的EJB对象

一,定义有状态Bean和无状态Bean 有状态Bean: @Stateful @Remote public class StatefulEjbBean implements StatefulEjb{ private int state; @Override public void compute(int i) { state=state+i; } @Override public int getResult() { return state; } } 无状态Bean: @Stateless @R

EJB之无状态会话Bean简单应用-学习与实践

客户通过由EJB容器提供的远程和本地接口进行通信 • 访问控制表是用于保证安全其授权能访问特定功能的用户组或个人表. • 持久性是指对象状态永久地存储在数据存储器中,诸如数据库. • 企业 beans的类型: –实体 (Entity) beans 实体beans支持多个会话和多个客户,可分为: Bean - 管理Bean持久性 Container- 管理容器的持久性 –会话 ( Session) beans 会话beans 执行业务任务时没有存储机制,可分为: 有状态会话(Stateful se

深入RESTful无状态原则

前言 在上篇RESTful基础知识中整体的介绍了RESTful架构设计思想的框架,在往后的RESTful主题博文中,我们在这个框架的基础上不断的为其填充更加深入的知识材料.  RESTful基础知识,传送门:http://blog.csdn.net/jmilk/article/details/50452595 无状态原则 Statelessness:无状态原则是RESTful架构设计中一个非常重要的原则,无状态是相对于有状态而言的.在理解什么是无状态的交互请求之前,首先我们需要了解什么是有状态,

HTTP协议是无状态协议,怎么理解

HTTP协议是无状态协议,怎么理解?   Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.  自己的理解,在asp.net里:每次提交服务器的页面没有任何关系,每次记录在页面的信息下次提交是记不住的,(除了应用本身可能已经存储在全局对象中的所有信息外)在.net里实际就是ViewState,ViewState是asp.net中保存页面信息的基本单位,应用时就是保存在控

如何制作无状态的ASP组件 (转)

如何制作无状态的ASP组件 一般我们在web或其它有关的无状态应用中使用组件时,脚本运行完毕后我们都会丢失组件的所有参照.当然可以简单地将组件的参照保存在会话(session )变量中,但这浪费资源.更聪明的方法是用会话变量或隐式表单标签保存组件的一些信息.当重新制作组件的实例时,试图用保存在会话变量中的信息恢复组件的状态.但两种方法的弊端都在于:从资源的角度来看过于昂贵,甚至恰好难以实现. 很幸运有个好消息.我们都知道可持续性的整个前提是能够将变量恢复到这样的状态,以至于组件知道在上次的例示中

如何制作无状态的ASP组件

2000-08-05· 青苹果电脑工作室·Yesky 一般我们在web或其它有关的无状态应用中使用组件时,脚本运行完毕后我们都会丢失组件的所有参照.当然可以简单地将组件的参照保存在会话(session )变量中,但这浪费资源.更聪明的方法是用会话变量或隐式表单标签保存组件的一些信息.当重新制作组件的实例时,试图用保存在会话变量中的信息恢复组件的状态.但两种方法的弊端都在于:从资源的角度来看过于昂贵,甚至恰好难以实现. 很幸运有个好消息.我们都知道可持续性的整个前提是能够将变量恢复到这样的状态,以

eclipse+JBoss 5+EJB3开发指南(1):编写第一个无状态的SessionBean

本系列教程使用的软件版本如下: Eclipse:3.4.2, Eclipse IDE for Java EE Developers JBoss :5.0.1,http://www.jboss.org/jbossas/downloads/ JDK:1.6.0.14,http://java.sun.com/javase/downloads/index.jsp 在本文中将编写一个简单的无状态SessionBean.在发布EJB时,一般需要将EJB程序以jar文件的形式 进行发布.这些jar文件将被放在