对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧——两个来自相同发起者的请求在服务器端是否具备上下文关系。
状态化请求,服务器端一般都要保存请求的相关信息,每个请求可以默认地使用以前的请求信息。
无状态请求,服务器端所能够处理的过程必须全部来自于请求所携带的信息,以及其他服务器端自身所保存的、并且可以被所有请求所使用的公共信息。
一、比较
有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。
由于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取钱,扣款成功后突然大停电,吐钱的操作还没做,这时候就要恢复没取钱时候的状态,否则钱扣了还没拿到手
相关推荐
本篇将深入探讨有状态Bean和无状态Bean的概念、区别以及它们的应用场景。** **1. 无状态会话Bean (Stateless Session Beans)** 无状态会话Bean是最基础的EJB类型,它不维护任何客户端会话状态。每次客户端调用方法...
- **会话Bean (Session Bean)**:分为有状态和无状态两种,用于封装业务逻辑操作。 - **消息驱动Bean (Message-Driven Bean)**:处理JMS(Java Message Service)消息。 ### 2. 有状态会话Bean (Stateful Session ...
在“易语言查询服务状态”这个主题中,我们将深入探讨如何使用易语言来获取和操作系统的服务状态。 首先,我们要了解Windows操作系统中的服务。服务是后台运行的程序,它们在用户登录之前或不与用户交互的情况下...
IPv6地址配置实验报告主要探讨了IPv6网络中两种主要的地址配置方式——无状态自动配置和有状态DHCPv6配置,同时也涉及到了IPv6地址前缀的更改、半状态DHCPv6配置以及在多DHCPv6服务器环境下的配置和DHCP中继代理的...
在本文提供的ejb_02_Client和ejb_02这两个文件夹中,可能包含了演示如何使用EJB创建和调用有状态和无状态会话Bean的示例代码。通过研究这些代码,你可以更深入地了解这两种类型的Bean如何工作,以及如何在实际项目中...
在这个主题中,我们将深入探讨NDP(邻居发现协议)、DHCPv6以及IPv6中的有状态和无状态地址分配,同时还会涉及服务器的搭建。 1. **IPv6地址**: - **表示方式**:IPv6地址通常由8个16位的块组成,每个块之间用...
每个状态类都有对应的操作,比如"检查资源使用情况"、"发送警报"或"执行恢复操作"。当服务器状态发生变化(如CPU负载过高、磁盘空间不足等),服务器对象会切换到相应的状态类,从而调用相应的处理方法。 例如,`...
服务器状态检测是IT运维工作中的一项基础任务,它关乎着系统的稳定性和安全性。在这个数字化时代,服务器作为企业数据处理和业务运行的核心,其健康状态直接影响到业务的正常运作。本工具正是针对这一需求而设计,...
有状态服务与无状态服务的区别在于,有状态服务需要维护状态信息,比如数据库、消息队列等,它们依赖于长时间运行并需要保存数据的实例。而无状态服务则是易于重启和替换的,例如Web服务器,它们不保存客户端状态,...
有状态(stateful)和无状态(stateless)地址转换是两种不同的地址转换技术,分别应用于不同的网络场景中。本文将对这两种技术进行详细分析,比较它们之间的差异,并解释其在不同场景下的应用。 一、有状态(stateful)...
- Windows操作系统中,有“服务”管理工具(services.msc)供用户查看和管理服务状态。 - Linux系统中,使用`systemctl`命令或`service`命令来管理服务。 - 在Unix-like系统中,`init`、`System V`、`Upstart`或`...
- **可靠的分布式服务**:Service Fabric支持创建和管理有状态和无状态的服务,确保即使在硬件故障情况下也能保持数据和服务的高可用性。 - **服务发现与通信**:服务之间可以动态发现并进行安全通信,支持服务间...
本文将深入探讨无状态聊天系统的设计与实现,以及涉及的主要技术——Ajax、Java和无状态特性。 一、无状态聊天系统的概念 无状态聊天系统意味着服务器不会在会话之间保留任何特定用户的信息。每次请求都被视为独立...
Stashboard 是 APIs 和软件服务状态仪表盘,类似亚马逊的 AWS Status Page 和谷歌的 Apps Status Page。Stashboard 最初由 Twilio 编写,提供 Twilio 的 Voice 和 SMS APIs 状态信息。Stashboard 设计的目的是为任意...
在UCS系统中,服务配置文件通过定义设备模板(template)和策略组(policy group)来实现无状态计算。这些配置文件中包含了服务器的启动顺序、SAN存储的LUN(逻辑单元号)信息、网络接口(NICs)和主机总线适配器...
综上所述,了解和掌握系统服务状态的查看与管理是系统管理员的基本技能,它有助于确保系统的稳定运行和高效管理。通过合理监控和调整服务状态,可以预防和解决多种系统问题,同时提升系统安全性。
EJB规范定义了三种主要类型的bean:无状态session bean、有状态session bean和实体bean,每种类型都有其特定的用途和生命周期。 1. **无状态Session Bean** 无状态session bean是最基础的EJB类型,它们不维护任何...
与有状态会话Bean不同,无状态会话Bean并不保存客户端状态,这使得它们更加轻量级且易于扩展。本文将详细介绍如何开发一个无状态会话Bean并在WebLogic服务器上部署及调用。 #### 二、无状态会话Bean基础概念 在深入...
当遇到“服务状态停止或启动,无法启动也无法停止”的问题时,这可能会影响到系统的稳定性和可用性。接下来,我们将对这个问题进行深入探讨,并提供一些解决方法。 ### 一、理解服务状态 首先,我们需要了解服务的...