如何维护应用程序状态

当您在阅读关于REST 的文章时,经常得到这样的建议——在客户端保存应用程序状态。但什么是“应用程序状态”?应当如何在客户端保存这些状态?本节描述了保存应用程序状态的最佳实践。

问题描述

您想知道如何管理RESTfulWeb 服务的状态,这样就不需要依赖于服务器内存中的会话了。

解决方案

将应用程序状态编码到URI里,并通过链接在表述中包含这些URI(见第5 章)。让客户端使用这些URI 与资源进行交互。如果状态过大,或出于安全或隐私考虑不能在网络中传输,则可以在持久化存储(如数据库或文件系统)中存储应用程序状态,并将其状态的引用编码在URI 中。

问题讨论

考虑一个简化的汽车保险应用,假定其中涉及两个步骤。第一步,客户端提交一个带有司机和车辆细节信息的请求,服务器返回一个一周内有效的报价。第二步,客户端提交购买保险的请求。在这个例子中,应用程序的状态就是报价。服务器需要知道从第一个步骤返回的报价,基于它才能给出第二个请求中的保单。

应用程序状态是服务器需要在每个客户端的每个请求之间维护的状态。在客户端保持这个状态并不意味着要像ASP.NET 和JavaServer Faces 之类的Web 框架所做的那样,把会话状态序列化到URI 或HTML 表单中。

由于HTTP 是无状态协议,每个请求与之前的请求都是独立的。然而,交互应用程序通常要求客户端执行时遵循特定顺序。这就要求服务器在协议之外暂时存储每个客户端在步骤序列里的当前位置。这里的诀窍是管理状态,这样就可以在可靠性、网络性能和可扩展性之间寻求平衡。

资源表述中的链接是保持应用程序状态的最好地方,如下所示:

# 请求

POST /quotegen HTTP/1.1

Host: www.example.org

Content-Type:application/x-www-form-urlencoded

fname=...&lname=...&..

# 响应

HTTP/1.1 200 OK

Content-Type: application/xml;charset=UTF-8

<quotexmlns:atom="http://www.w3.org/2005/Atom">

<driver>

...

</driver>

<vehicle>

...

</vehicle>

<offer>

...

<valid-until>2009-10-02</valid-until>

<atom:linkhref="http://www.example.org/quotes/buy?quote=abc1234"

rel="http://www.example.org/rels/quotes/buy"/>❶

</offer>

</html>

❶ 一个包含应用程序状态的链接

在这个例子中,服务器把报价保存在数据存储里,并将主键编码在URI 中。当客户端使用该URI发起请求购买保险时,服务器可以通过这个主键恢复该应用程序状态。

应当选择形如数据库或文件系统的持久化存储来保存应用程序状态。使用缓存或内存会话这样的非持久化存储会降低Web 服务的可靠性,例如在服务器重启时状态可能会丢失,非持久化存储解决方案也会降低服务器的可扩展性。

如果报价所需的数据量很小,服务器可以将状态编码在URI 中,正如稍后代码所展示的那样。

当在数据库中保存应用程序状态时,使用数据库复制(replication)以便所有服务器实例都可以访问这些状态。如果应用程序状态不是永久的,可能需要在某些地方清理这些状态。

# 请求

GET/quotegen?fname=...&lname=...&... HTTP/1.1

Host: www.example.org

# 响应

HTTP/1.1 200 OK

Content-Type: application/xml;charset=UTF-8

<quotexmlns:atom="http://www.w3.org/2005/Atom">

<driver>

...

</driver>

<vehicle>

...

</vehicle>

<offer>

...

<valid-until>2009-08-02</valid-until>

<atom:linkhref="http://www.example.org/quotes/buy?fname=...&lname=...&..."

rel="http://www.example.org/quotes/buy"/>

</offer>

</html>

因为客户端需要在每个请求中发回以上这些数据,在链接中编码应用程序状态会降低网络性能。然而这样可以提高可扩展性,因为服务器不需要保存任何数据;也可以提高可靠性,因为服务器不需要使用复制。可以基于特定用例和状态数量,组合以上两种方式来管理应用程序状态,保持网络性能、可扩展性和可靠性之间的平衡。

本文节选自《RESTful Web Services Cookbook中文版 》一书

图书详细信息:http://blog.csdn.net/broadview2006/article/details/6826999

如何维护应用程序状态相关推荐

  1. Data Artisans发布支持ACID事务的流式处理框架Streaming Ledger

    data Artisans宣布推出Streaming Ledger,它扩展了Apache Flink,提供了跨表.键和事件流执行可序列化ACID事务的功能.这项正在申请专利的技术是Flink的专有附加 ...

  2. 基于 REST 的 Web 服务:基础

    from: https://www.ibm.com/developerworks/cn/webservices/ws-restful/ 基础 REST 定义了一组体系架构原则,您可以根据这些原则设计以 ...

  3. Redux 核心概念

    http://gaearon.github.io/redux/index.html ,文档在 http://rackt.github.io/redux/index.html .本文不是官方文档的翻译. ...

  4. Application 类 简介

    2019独角兽企业重金招聘Python工程师标准>>> Application 类 简介 每次程序运行时,程序的Application 类都是保持实例化.与Activity不同:配置 ...

  5. 《RESTful Web Services》第一章 使用统一接口

    序言 HTTP是一种应用层协议.SOAP和一些Ajax Web框架都将HTTP作为一种传输信息的协议,难以充分利用HTTP层的基础设施. 1.2 如何保持交互的可见性 可见性是HTTP的一个核心特征. ...

  6. orcale可视化建立用户_建立动态可视化的新方法

    orcale可视化建立用户 by Sushrut Shivaswamy 通过Sushrut Shivaswamy 建立动态可视化的新方法 (A new way of building dynamic ...

  7. 如何学习ReactJS:初学者完整指南

    每个前端开发人员和Web开发人员都知道在多个地方编写相同的代码是多么令人沮丧和痛苦.如果他们需要在多个页面上添加一个按钮,他们将被迫编写大量代码. 使用其他框架的开发人员即使在编写频繁更改的组件时也面 ...

  8. 燕山大学——软件用户界面设计(五)UI架构

    界面设计中的"设计"与"实现",本节的UI架构属于"实现"部分. 1.GUI设计模式(Design patterns for GUIs) ( ...

  9. IT运维面试问题总结-LVS、Keepalived、HAProxy、Kubernetes、OpenShift

    文章目录 1.简述ETCD及其特点 2.简述ETCD适应的场景? 3.简述HAProxy及其特性 4.简述HAProxy常见的负载均衡策略? 5.简述负载均衡四层和七层的区别? 6.简述LVS.Ngi ...

  10. [翻译]WP7 QuickStart-第十一篇-在后台运行程序(墓碑效应)

    [译者注:这篇文章是翻译自微软官方的WP7 QuickStart的第十一篇,讲述WP下的程序的墓碑效应.部分内容加入了自己的理解和表达习惯.而翻译此系列的主要目的一是为了练习英语,二是让自己作为一个 ...

最新文章

  1. jquery设置复选框为只读_checkbox设置复选框的只读效果不让用户勾选
  2. 7-9 设计一个能处理异常的Loan类 (20 分)
  3. 学习Spring Boot:(十三)配置 Shiro 权限认证
  4. 建立数组并写入数据_VBA学习笔记19:数组1
  5. 启动angular项目,端口被占用
  6. 线性表的链式存储——单链表的遍历与优化
  7. Kafka 麒麟先生_近百位超人气嘉宾出席元旦萤火虫,重磅新企划蓄势待发!
  8. 编写可执行程序,其它程序调用,并返回数据,C#
  9. PHP 变量 与 运算符
  10. 复制移动VMware Workstation虚拟机文件产生的问题【转】
  11. MyBatis的插件
  12. 支持向量机SVM和最小二乘支持向量机LSSVM
  13. PHP合并多个excel文件
  14. HTML颜色值的设置
  15. RestTemplate的No instances available for xxx
  16. 小波阈值去噪c语言程序,小波阈值去噪MATLAB程序
  17. Debian9.5系统DNS服务器BIND软件配置说明
  18. Java类的继承学生研究生类图_UML part3 类图、对象图
  19. 2.63-将下面的C函数代码补充完整。函数srl用算术右移(由值xsra给出)来完成逻辑右移,后面的其他操作不包括右移或者除法。
  20. win10计算机维护,Win10系统打开或关闭自动维护功能的方法

热门文章

  1. 通过阿里OSS文件服务返回的URL获取文件流下载
  2. rest-framework框架的基本组件
  3. 收藏一个好看的单选多选样式
  4. android获取周围AP信息(上)
  5. PBXCp Error
  6. Javascript标准参考教程学习记录
  7. FFPLAY的原理(三)
  8. A计划 hdu2102(bfs一般题)
  9. 《构建高性能WEB站点》读书笔记--第一章
  10. BZOJ 1030 [JSOI2007]文本生成器(ac自动机+dp)