无状态服务(stateless service)

简介: 一、定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息 有状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的 二、优劣 有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一

一、定义

无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息

有状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的

二、优劣

有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。由于HTTP协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的session,将用户挑选的商品(购物车),保存到session中,当付款的时候,再从购物车里取出商品信息

有状态服务可以很容易地实现事务,所以也是有价值的。但是经常听到一种说法,即server要设计为无状态的,这主要是从可伸缩性来考虑的。如果server是无状态的,那么对于客户端来说,就可以将请求发送到任意一台server上,然后就可以通过负载均衡等手段,实现水平扩展。如果server是有状态的,那么就无法很容易地实现了,因为客户端需要始终把请求发到同一台server才行,所谓“session迁移”等方案,也就是为了解决这个问题

6486d16d-38c6-38de-837f-637ff99c30d4.png

三、session和cookie

基于session和cookie都可以实现事务,可以认为,session是有状态的,而cookie是无状态的

四、无状态实现事务的方法

并不是一定要用有状态服务才能实现事务,本文提供另外的几种方案作为参考
举一个多次提交的场景作为例子:用户需要提交很多数据,分为2个页面提交

d2a571e3-dea4-3fad-bf5b-e896730ebf10.png

这里就涉及到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同样是无状态的,可以做水平扩展

47bd72bf-1162-33d2-be07-0ddcebdc633a.png

六、无状态类

引申一下,JAVA里有一种类的设计,可以称为无状态类。这种类的特征是只有方法没有字段,在三层架构(展现层、逻辑层、持久层)里,逻辑层经常可以看到这种类
我觉得无状态类和stateless server在思想上是一样的,这个类本身是没有状态的,所以当外部要调用它的方法时,需要在方法参数中传来所需的所有信息,不依赖该类自身的状态(字段值),在并发环境下,可以避免多线程带来的副作用

七、总结

有状态服务可以比较容易地实现事务,在不需要考虑水平扩展时,是比较好的选择
无状态服务的优势在于可以很方便地水平伸缩,但是在实现事务时,需要做一些额外的动作
可以通过剥离session等方法,将一个有状态服务,转换成无状态服务

原文链接;

http://kyfxbl.iteye.com/blog/1831869

目录
相关文章
|
编解码 Java 编译器
【Protobuf】Protobuf中的Message语法规范
在Message中定义一个或者多个字段,FieldType是字段的数据类型,可以是基本类型(如int32、string、bool等)或其他定义的Message类型。fieldName是字段的名称,可以根据需求自定义。fieldNumber是字段的唯一标识号,用于在消息的二进制编码中标识字段。
1447 0
|
前端开发 JavaScript Java
没错,你可以移动式编码了:4款最好的Android设备HTML编辑器
作为出色的应用平台,Android系统不仅可以用于登录Facebook或是玩“愤怒的小鸟”,它还可以为web开发人员提供可行的移动式解决方案。然而,web开发者是不可能对那些陈旧的文本编辑器表示满意的——他们需要使用专门的代码编辑器,以便让工作更快速更便捷地完成。下面我将要介绍4款名列前茅用于Android设备的HTML编辑器,任何web开发人员都能利用它们在平板电脑上处理大量工作,或是在智能手机上进行一些快速修改。
4387 0
没错,你可以移动式编码了:4款最好的Android设备HTML编辑器
|
存储 关系型数据库 MySQL
深入理解MySQL索引:从原理到最佳实践
深入理解MySQL索引:从原理到最佳实践
1511 0
|
Cloud Native 网络协议 数据中心
Overlay网络与Underlay网络:深入探索与全面对比
在当今云原生的世界中🌍☁️,网络是构建和维护任何分布式系统的基石💎。了解Overlay网络和Underlay网络及其之间的区别🔍,对于设计高效、可扩展的云原生应用至关重要🚀。本文旨在全面解析Overlay和Underlay网络,揭示它们的工作原理、优缺点,并说明何种情况下应该使用哪一种网络📚。
Overlay网络与Underlay网络:深入探索与全面对比
umount: /dev/xvdb1: not mounted 磁盘卸载出现异常
【问题现象】 服务器中执行umount卸载命令时提示磁盘没有挂载 [root@zxj ~]# umount /dev/xvdb1 umount: /dev/xvdb1: not mounted 【问题描述】 最开始接到用户反馈问题描述如下 1)新添加了一块数据盘,把数据盘挂载到了/home 目录下 2)/home 目录下原本是有文件的,导致原本的文件查看不到 【处理过程】 刚开始接到这个反馈,以为只是简单的同一个目录挂载了两个设备导致原本的文件被遮盖,只需要简单的进行umount卸载后挂载的数据盘分区即可。
16231 0
|
前端开发 搜索推荐 开发工具
通义灵码与颜色板生成器,为前端开发提供智能配色解决方案
在前端开发中,色彩搭配对用户体验和界面美观至关重要。通义灵码提供的颜色板生成器通过自动推荐配色方案、随机生成颜色组合及支持自定义调整,帮助开发者高效完成配色任务。该工具支持一键导出为 CSS 样式表,并提供简洁的中文指令交互方式,大大提升开发效率,助力开发者打造美观和谐的用户界面。
|
程序员 数据库 微服务
长事务管理不再难:Saga模式全面解析
本文介绍了分布式事务中的Saga模式,它用于解决微服务架构下的事务管理问题。Saga通过一系列本地事务和补偿操作确保最终一致性,分为编排和协同两种模式。文章重点讲解了编排模式,其中 Saga 协调者负责事务的执行和失败后的补偿。Saga 模式适用于业务流程明确且需要严格补偿的场景,能有效管理长事务,但实现上可能增加复杂性,并存在一致性延迟。文章还讨论了其优缺点和适用场景,强调了在面对分布式事务挑战时,Saga 模式的价值和潜力。
3688 6
|
算法 网络架构
MAC地址与帧结构
本文介绍了MAC地址和帧结构的基础知识。MAC地址是48位物理地址,分为组织唯一标识符(OUI)和制造商自定义两部分,用于局域网设备识别与链路层通信。帧结构以以太网帧为例,包含前导码、帧开始定界符、目的与源MAC地址、类型/长度字段、数据字段及帧校验序列(FCS),确保数据传输的准确性和可靠性。
1867 8
|
关系型数据库 MySQL
MySql 计算两个日期的时间差函数
MySql计算两个日期的时间差函数 MySql计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差。
14116 1
|
数据采集 Prometheus 监控
监控堆外第三方监控工具Grafana
监控堆外第三方监控工具Grafana
854 5

热门文章

最新文章