浅谈无状态和有状态服务的区别

对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧——两个来自相同发起者的请求在服务器端是否具备上下文关系。

状态化请求,服务器端一般都要保存请求的相关信息,每个请求可以默认地使用以前的请求信息。

无状态请求,服务器端所能够处理的过程必须全部来自于请求所携带的信息,以及其他服务器端自身所保存的、并且可以被所有请求所使用的公共信息。

一、比较

有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。

由于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取钱,扣款成功后突然大停电,吐钱的操作还没做,这时候就要恢复没取钱时候的状态,否则钱扣了还没拿到手,多冤枉。

原文地址:https://www.cnblogs.com/hxm-35-Simle/p/11186600.html

时间: 2024-10-07 20:59:38

浅谈无状态和有状态服务的区别的相关文章

浅谈分布式计算系统和集群系统的区别

随着项目经验的增长笔者对分布式计算的了解是越来越深入,那么接下来笔者就和大家浅谈下分布式系统的特点吧,可以这样理解,分布式系统是将多个子任务分布在不同的物理机上并行工作.是以空间换时间并行计算来提高程序的可靠性和性能.分布式系统的高性能计算属于MIMD的范畴领域.它是按不同的业务分配不同的节点(单点),组织比较松散,一个节点垮掉那么些节点负责的业务就不能正常处理,当然,技术到位肯定会有其他解决方案例如基于Remoting通信方案WCF通信方案. 而采用集群方案,同样提供10台服务器,每台服务器都

浅谈无缓存I/O操作和标准I/O文件操作差别

首先,先略微了解系统调用的概念: 系统调用,英文名system call,每一个操作系统都在内核里有一些内建的函数库,这些函数能够用来完毕一些系统系统调用把应用程序的请求传给内核,调用对应的的内核函数完毕所需的处理,将处理结果返回给应用程序,假设没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(ApplicationProgramming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统

浅谈无缓存I/O操作和标准I/O文件操作区别

首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(ApplicationProgramming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统内

浅谈无参数RCE[未完】

0x00 前言 这几天做了几道无参数RCE的题目,这里来总结一下,以后忘了也方便再捡起来. 首先先来解释一下什么是无参数RCE: 形式: if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { eval($_GET['code']);} preg_replace('/[a-z]+\((?R)?\)/', NULL, $code) pre_match('/et|na|nt|strlen|info|path||rand|d

浅谈数通畅联ECP与EAC的区别

最近收到很多客户的提问,AEAI ECP企业云联平台是什么产品?为什么AEAI ECP中包括集成套件?EAC也是数通畅联的产品吗?同样涉及集成两者有什么区别呢?诸如此类的问题还有很多. 其实AEAI ECP与EAC是两种不同的模式,一个为实际产品,一个以方案形式在项目中实现,两者在联系中存在着区别,为了使关注数通畅联动态的朋友能更好的区分它们,下面小编就为大家详细介绍下二者的区别. 注意:本文中假定读者已经了解沈阳数通畅联软件技术有限公司的基本情况,以及对文章中涉及的SOA综合集成项目.AEAI

浅谈href=#与href=javascript:void(0)的区别

#"包含了一个位置信息 默认的锚点是#top 也就是网页的上端 而javascript:void(0)  仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首 而javascript:void(0) 则不是如此 所以调用脚本的时候最好用void(0) 或者<input onclick> <div onclick>等 打开新窗口链接的几种办法 1.window.open('url') 2.用自定义函数 <script>       

浅谈jQuery的$(function(){})和(function($){}(jQuery))的区别

一:$(function(){}) $(function(){})是$(document).ready(function(){})的简写,或者$().ready(function(){}),会在DOM加载完成之后执行. 与onload的区别在于:ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件):而onload,指示页面包含图片等文件在内的所有元素都加载完成. 二:(function($){}(jQuery)) (function($){}(jQuery))是立即执行函数:相当于

浅谈hibernate、ibatis、myibatis之间的区别?

ibatis 是一个半自动的框架,为什么说是半自动呢?因为它可以生成一部分的代码,另外一部分需要我们手动去写ibatis 采用的是SQL语句跟实体之间的一个映射关系,在我们select语句中,我们通过javabean 引入到select 语句中,根据不同的占位符,注入不同的javabean属性值当然在我们这个ibatis框架中不仅仅只有javabean 的方式,还有MAP ,integer,xml等形式进行引入.用得比较多还是我们的javabean,map,interger,一般情况下xml文件

浅谈JS中的typeof和instanceof的区别

JS中的typeof和instanceof常用来判断一个变量是否为空,或者是什么类型. typeof typeof运算符返回一个用来表示表达式的数据类型的字符串. typeof一般返回以下几个字符串: "number", "string","boolean","object","function","undefined" 对于Array,Null等特殊对象使用typeof一律返回obje