`
zhile005
  • 浏览: 53426 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转:对于REST中无状态(stateless)的一点认识

 
阅读更多
首先,一个Web应用程序协议的“状态”在通常指的是为两个相互关联的用户交互操作保留的某种公共信息,它们常常被用来存储工作流或用户状态信息等数据。这些信息可以被指定不同的作用域如page,request,session或全局作用域,而存储他们的责任也同样可以由Client端或Server端负责。虽然存储状态为企业软件开发带来了诸多便利,但是它也给分布式系统的其他方面带来了许多限制,比如在负载均衡方面,在有状态的模式下,一个用户的请求必须被提交到保存有其相关状态信息的服务器上,否则这些请求可能无法被理解,这也就意味着在此模式下服务器端无法对用户请求进行自由调度。于此相关的另一个问题是容错性,倘若保有用户信息的服务器宕机,那么该用户最近的所有交互操作将无法被透明地移送至备用服务器上,除非该服务器时刻与主服务器同步全部用户的状态信息。此外,由于HTTP本身不是一个有状态的协议,开发人员必须通过模拟实现状态的钝化与激活等。于是为了克服这些不足,无状态(Statelessness)架构风格属性受到了广泛关注。
无状态指的是任意一个Web请求必须完全与其他请求隔离,当请求端提出请求时,请求本身包含了相应端为相应这一请求所需的全部信息。这一约束的出现改善了分布式系统的可见性、可靠性以及可伸缩性,具体的介绍可以参考Roy T. Fielding博士的论文,这里就不哆嗦了。这些从整个系统角度来看无状态似乎过于抽象,那么对于用户来说,怎么感觉的有状态与无状态的差别呢。简单的方法是浏览器的后退按钮,如果一个网站期望用户以A->B->C的流程来交互,而在执行至B时回退的话,那么系统很有可能不是按照其所期望的方式运行,因为用户的状态可能被不可逆地修改了。反过来,搜索引擎(我指的是普通意义上的搜索引擎,而不是根据用户搜索历史个性化了的)是一个无状态架构的范例。任何用户可以在浏览器地址栏中输入http://www.google.com/search?q=RESTful&start=100来获得从第一百条开始的关于RESTful的记录,并且当Google摩洛哥服务器瘫痪时,相关用户请求会被透明地移送至其他服务器。

一切似乎很明了,那么是什么导致了那位朋友的误解呢,答案是RESTful架构对于state的两个不同的解释: 应用状态(Application State)和资源状态(Resource State)。应用状态指的是与某一特定请求相关的状态信息,而资源状态则反映了某一存储在服务器端资源在某一时刻的特定状态,该状态不会因为用户请求而改变,任何用户在同一时刻对该资源的请求都会获得这一状态的表现(Representation)。RESTful架构要求服务器端不保有任何与特定HTTP请求相关的资源,所以应用状态必须由请求方在请求过程中提供。那么再回到那个邮件列表中的问题,为什么传递一个session ID是违背REST架构风格而传递user credentials却不是。我想作者的疑惑源于他没有分清什么是有状态和无状态的架构属性,而认为“传递某种表示状态的信息”到服务器便是“有状态”的表现。其实有状态和无状态与请求本身没有多大关联,重要的是状态信息是由请求方还是响应方负责保存。在Session ID可以被认为是一个用来标识某一会话状态的Key,将其传递给服务器端意味着这样一个请求:“请帮我取出这个状态信息”,也就是说这个请求假设响应方保有着状态信息。由于与某一特定请求相关的状态属于应用状态,而RESTful架构要求任何此类状态由请求方负责提供,所以传递Session ID被认为是unRESTful的做法。反过来,user credential作为一种应用状态,是被期望由请求方提供的,所以在请求中传递user credentials(姑且忽略安全性问题)是符合RESTful架构规范的。

这篇随笔或多或少散发着某种纯粹主义的味道,但我觉得有些概念是值得玩味的。任何一种架构风格的出现都有其期望的,对现有方案的改进或期望克服的问题。作为REST来说,它所期望的是组件的可伸缩性,组件的独立部署,接口统一等特性,而无状态作为实现这组需求的一个特性,个人认为是有必要清楚了解并实际开发过程中落实的。
分享到:
评论

相关推荐

    有状态stateful与无状态stateless地址转换.docx

    有状态(stateful)和无状态(stateless)地址转换是两种不同的地址转换技术,分别应用于不同的网络场景中。本文将对这两种技术进行详细分析,比较它们之间的差异,并解释其在不同场景下的应用。 一、有状态(stateful)...

    浅析C# 状态机Stateless

    C# 状态机 Stateless 详解 C# 状态机 Stateless 是一种轻量级的状态机库,能够帮助开发者轻松地创建状态机,实现状态之间的切换。下面是对 C# 状态机 Stateless 的详细介绍。 什么是状态机? 状态机(Finite ...

    stateless:转到用于创建状态机的库

    无状态 直接在Go代码中创建状态机和基于轻量级状态机的工作流: phoneCall := stateless . NewStateMachine ( stateOffHook ) phoneCall . Configure ( stateOffHook ). Permit ( triggerCallDialed , stateRinging...

    GPSR: Greedy Perimeter Stateless Routing for Wireless Networks

    《GPSR: Greedy Perimeter Stateless Routing for Wireless Networks》是一篇介绍了一种新型无线数据报网络路由协议——贪婪周界无状态路由(GPSR)的研究文章。该协议通过利用路由器的位置信息以及数据包的目的地来...

    quartz有状态Job和无状态Job

    在Quartz调度器中,根据Job是否能够保持状态,可以将其分为两类:有状态Job(Stateful Job)和无状态Job( Stateless Job)。这两种类型的Job在实现上有所不同,并且它们在应用场景中也各具特色。 #### 二、无状态Job ...

    Rest所需jar文件

    服务器响应时,仅返回状态变化的结果,不保存客户端的任何状态信息,实现无状态(Stateless)通信。 5. **轻量级(Lightweight)**:REST使用简单的HTTP协议,降低了客户端和服务器之间的复杂性,使得系统更加灵活...

    stateless:一个用DELPHI代码创建状态机的简单库

    - `examples` 目录:可能包含了一些示例代码,展示了如何在 DELPHI 项目中使用 "stateless" 库来创建和操作状态机。 - `unit` 或 `interface` 文件:定义了库的公共接口,包括状态机类、状态枚举和其他相关类型。 - ...

    ejb有状态bean和无状态bean

    EJB主要分为三种类型:无状态会话Bean(Stateless Session Beans)、有状态会话Bean(Stateful Session Beans)以及实体Bean(Entity Beans)。本篇将深入探讨有状态Bean和无状态Bean的概念、区别以及它们的应用场景...

    基于springboot+sureness的面向REST API资源无状态认证权限管理系统.zip

    标题中的“基于springboot+sureness的面向REST API资源无状态认证权限管理系统”是一个使用Spring Boot框架和Sureness库构建的API安全解决方案。这个系统旨在为RESTful API提供无状态的认证和授权管理,确保API服务...

    PAS(Primeton Application Server)企业版EJB开发案例分析:有状态/无状态会话Bean与CMP/BMP实体Bean

    主要包括有状态会话Bean (Stateful Session Bean) 和无状态会话Bean (Stateless Session Bean),以及容器管理持久化实体Bean (CMP Entity Bean) 和Bean管理持久化实体Bean (BMP Entity Bean) 的开发过程。...

    10.REST-API:Tentang Rest API

    4. **无状态(Stateless)**:每个RESTful请求应包含所有必要的信息,服务器不应保存任何会话状态。这意味着每次请求都是独立的,降低了服务器存储负担。 5. **缓存(Caching)**:REST API允许客户端缓存响应,...

    java源码:Java EJB中有、无状态SessionBean的两个例子.zip

    本压缩包提供了两个关于Java EJB中状态ful(有状态)和stateless(无状态)SessionBean的实例,帮助开发者深入理解这两种类型的Bean。 一、有状态SessionBean(Stateful Session Bean) 有状态SessionBean(SFSB,...

    trex-stateless-gui:TRex无状态GUI

    TRex无状态GUI TREX无国籍GUI应用程序提供了一种图形用户界面 。 描述和主要特点: TRex无状态GUI应用程序是基于JavaFX的应用程序。 该应用程序的主要功能可以分为树状部分(TRex管理,流量配置文件管理和数据包...

    stateless-shiro:REST Web 服务中使用的 Shiro

    无国籍四郎REST Web 服务中使用的 Shiro发射 mvn clean package spring-boot:run或在您的 IDE 中运行 Application.main()。初始化填写用户进行测试 curl -H "Content-Type: application/json" -X PUT ...

    REST开发框架及示例

    - 无状态(Stateless):每次请求都包含所有必要的信息,服务器不保存任何会话状态。 - 缓存(Cacheable):允许客户端缓存响应,提高性能。 - 层次化系统:服务器可以内嵌子资源,客户端无需关心层次结构。 - ...

    csy512889371#reactLearn#React学习笔记_无状态组件(Stateless Component) 与高阶

    一、无状态组件 (Stateless Component) 二、无状态组件与组件的生命周期方法 三、无状态组件不支持 "ref" 四、无状态组件尚不支持 bab

Global site tag (gtag.js) - Google Analytics