`

无状态服务(stateless service)

阅读更多
一、定义

无状态服务(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
  • 大小: 3.9 KB
  • 大小: 23.9 KB
  • 大小: 5.8 KB
分享到:
评论
1 楼 zyw6331575 2016-12-01  
赞!!!!!!

相关推荐

    EJB3 示例有状态和无状态会话bean

    在EJB3中,我们通过在接口上添加`@Stateless`注解来定义一个无状态会话Bean。 ### 4. 测试EJB3会话Bean 在给定的描述中提到的`Test.jsp`是一个用于测试远程无状态会话bean的页面。这个页面通常会被包含在Web应用...

    Kubernetes有状态集群服务部署与管理.rar

    在Kubernetes中,服务分为两种类型:无状态服务(Stateless Services)和有状态服务(Stateful Services)。无状态服务通常不需要保存任何持久化数据,实例之间可以互换,而有状态服务则需要保持数据的持久性,并且...

    EJB3+JPA开发总结

    无状态会话Bean是一种轻量级的服务组件,它可以处理客户端请求,但是不保存任何会话状态。在EJB3中,开发无状态会话Bean变得非常简单。 ##### 1. 开发只存在Remote接口的无状态会话Bean **步骤如下:** **第一步*...

    在ArcGIS中应用EJB的实例,用无状态BEAN连接地图服务器java.zip

    在这个实例中,我们将探讨如何使用无状态Session Bean(BEAN)来连接ArcGIS地图服务器,从而实现对地图服务的操作。 无状态Session Bean是一种EJB类型,它不保存任何客户端会话信息,因此在处理完一个请求后,Bean...

    PKI@MBS Agent Service开发参考文档

    在当前基于HTTP的系统架构中,客户端与服务器之间的连接是无状态(stateless)的。这意味着每一次客户端与服务器之间的交互都需要重新建立连接,无法保持持续的状态。因此,为了实现客户端与服务器间的会话(session),...

    如何在servcie Fabric项目中运行Entity Framework 的enable-migrations 命令1

    以一个无状态(Stateless)Service Fabric项目为例,我们需要按照以下步骤操作: 1. **设置默认项目**:确保在Visual Studio的解决方案资源管理器中,将无状态服务项目(例如:MyStateless)设置为默认项目。这是...

    DHCPv6 Based IPv6 Access Service

    在IPv6环境中,地址的自动配置有两种主要方式:无状态地址自动配置(SLAAC,Stateless Address Autoconfiguration)和DHCPv6。 DHCPv6是IPv6的动态主机配置协议,它允许网络设备从服务器获取网络配置信息,包括IP...

    MassTransit.ServiceFabric:MassTransit的服务结构位和摆动

    为了使侦听器深入到无状态服务中,我们必须重写StatelessService上的CreateServiceInstanceListeners方法,然后我们需要创建ServiceInstanceListener并传入将创建MassTransitListener 。 public class ...

    Manning.Cloud.Native.Patterns.2019.5.pdf

    无状态服务(Stateless services)不存储任何需要用于后续服务调用的状态信息。这通常意味着服务不将数据保存在内存或本地磁盘中。 有状态服务(Stateful services)则是设计用来持久化状态的服务,例如数据库和...

    EJB3.0学习总结(二)--EJB3.0容器模型的WEB服务

    2. **会话Bean(Session Bean)**:处理客户端请求,可以是无状态(Stateless Session Bean)或有状态(Stateful Session Bean)。无状态Bean适用于一次性的请求处理,而有状态Bean则能保持与客户端的交互状态。 3....

    rock.tsf.jar

    doService( )在每次执行之后返回一个状态值,他包括三种状态:连接结束(Over),无状态连接(StateLess),有状态连接(StateFul)。每个线程实例在doService()调用结束之后,调用ManagerService的disposeResponder()...

    net Wcf应用实例-含控制台和windows服务宿主

    1. **会话模式**:根据服务需求选择合适的会话模式,无状态(Stateless)或有状态(Stateful)。 2. **缓存策略**:合理使用缓存可提高服务响应速度,但需注意内存管理和并发问题。 3. **并发控制**:调整服务的...

    ejb

    EJB技术主要包含三种类型的组件:无状态会话bean(Stateless Session Beans)、有状态会话bean(Stateful Session Beans)以及消息驱动bean(Message-Driven Beans)。 1. 无状态会话bean(Stateless Session Beans...

    经典JAVA笔试题(经典)

    - Session Bean 提供业务逻辑,分为无状态(Stateless)和有状态(Stateful)两种,无状态不保存客户端状态,有状态则保存。 - Entity Bean 代表持久化的数据,与数据库中的记录相对应,同样分为无状态(Entity...

    EJB方面面试题.doc

    1. **Session Bean**:提供临时的业务逻辑服务,可以是有状态(Stateful Session Bean)或无状态(Stateless Session Bean)。有状态的Session Bean可以跟踪用户会话状态,而无状态的Session Bean不维护用户状态,更...

    EJB入门及高级特性

    会话Bean分为无状态会话Bean(Stateless Session Beans)和有状态会话Bean(Stateful Session Beans)。前者不维护客户端状态,适合处理独立的请求;后者则保存客户端状态,适用于需要跟踪会话的应用场景。 **8. ...

    EJB发布WEB服务一般步骤.pdf

    Stateless Session Bean适用于无状态的服务调用,容器负责管理多个请求的分发。Stateful Session Bean则保留了会话状态,允许多次调用之间保持数据。 3. **持久化处理**: - **Message-Driven Bean (MDB)**:用于...

    xcat详细架构讲解

    在**xCAT**中,根据节点的状态管理方式不同,可以将其分为两类:无状态节点(stateless nodes)和有状态节点(stateful nodes)。无状态节点通常不保存任何本地数据,所有数据都存储在网络或外部存储设备上,这使得...

    java经典面试题和答案(128题经典java面试题)

    会话Bean负责业务逻辑,分无状态(Stateless Session Bean)和有状态(Stateful Session Bean)。无状态Bean不保存客户端状态,而有状态Bean为每个客户端保留状态信息。 8. **SessionBean与EntityBean**:Session...

Global site tag (gtag.js) - Google Analytics