写点什么

异步 REST 操作的处理

  • 2009-07-09
  • 本文字数:1409 字

    阅读完需:约 5 分钟

Tim Bray 在他的新博文 Slow REST 中尝试回答以下问题:

在 RESTful 的环境中,如何处理(POST、PUT、DELETE)等操作对资源状态的改变。这些操作存在延时,有时行为也不可预测。

Tim 为我们描述了解决这种问题三种不同方法,他们出自 Project Kenai 的正式报告《处理异步操作请求》的一部分,描述如下:

  • 基于资源的方法 > 新的“Status”资源模型……包含以下属性域:

    • “uri”:客户端进行轮询“完成状态”的 GET 操作所使用的 URI。每一个被接受的异步操作将收到一个唯一的状态 URI,这样就可以对多个操作同时进行初始化和跟踪。
    • “status”:它是一个整型数值,用于描述完成状态(0= 成功,非 0= 错误码),该状态码只有在“progress”返回 100 时才返回。
    • “message”:完成状态消息描述,只有在“progress”返回 100 时才返回
    • “progress”:指示操作的进度,整型数值,当操作完成执行时,不论是成功还是失败,都返回 100。

    上述资源对象可以这样使用: > 对于任何 PUT/POST/DELETE 操作,返回“202 In progress”,并返回“Status”资源,……目的是为实现者提供低成本的用于轮询的钩子(hook)。

  • Comet 风格的实现——为长运行的请求保持 HTTP 通道的开放。 > - 初始响应消息必须包含 202 的 HTTP 状态码(“Accepted”)……以及包含本次操作的初始 Status 资源的消息实体。在 Status 资源中一定要包含“uri”和“progress”两个属性,其中“progress” 域必须是 0,用于指定操作已经开始。

    • 初始响应消息的 URI 值必须包含对应着 GET 操作的新 Status 资源。典型地,“progress” 域的数值会向 100 增长,但是不到操作结束一定不能被设成 100。
    • 当操作结束时(成功或失败),状态资源的“最终”形式必须返回,其中“progress”域被设置成 100,“status”域被设置成 0(对于成功完成)或者非 0 的数值(对于失败的完成)。
  • “Web hooks”型:使用两个独立的“one-way”调用,一个用于启动长运行的操作,另一个用于在操作完成时通知请求者。 > - 请求操作的入站消息可能包含一个“webhook”域,如果客户端期待回调,该域的值是一个 URI;如果这个域不存在,则说明客户端不需要回调。

    • 操作完成时(成功或失败),服务器将向 webhook URI 发出一个 POST 请求,附带……包含 该操作最终状态资源的消息
    • 客户端通过对完成报告与初始 Status 响应中“URI”域的比较,找到的原始的请求,也可以通 过为每次异步请求提供一个唯一的 webhook URI 来将关联响应和请

Tim 在结束博文的结尾向大家征求意见:

……是否整个“Slow REST”能够作为一个模式?今后当人们考虑标准的实现方法时,是否会经常想起它。

Tim 的博文引起了若干回复,其中比较有意思的一条回复来自 William Vambenepe,他将 Tim 博文中提出的问题和解决方法同 WS* 标准(特别是 WSRF 和 WS-Notifications)中的问题和解决方法做了一个比较。William 认为:

WSRF 并没有覆盖博文中介绍的场景,但是在 WS-ResourceLifetime 和 WS-Notification 中我们依稀可见一些相似的场景(也许下次你就会碰到)。如果加入 WS-MakeConnection (WS- RX 的一部分),你的“web hooks”的想法可能会更切合实际……我常常有一种直觉:“REST”和“WS-*” 应该走得更近。

尽管在 REST 和 WS* 存在着很多差异(有些是实际存在的,有些是信仰上的),两个阵营都致力于解决实际生活中存在的问题,也必然会碰到相同的挑战。相互借鉴对方的实现和经验必然会互助互惠。

查看英文原文 Handling Asynchronous REST Operations

2009-07-09 22:075871
用户头像

发布了 184 篇内容, 共 89.9 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

C# 如何部分加载“超大”解决方案中的部分项目

newbe36524

C# Docker Kubernetes

Flink CEP 在抖音电商的业务实践

Apache Flink

大数据 flink 实时计算

看海泰方圆类ChatGPT技术模型!

电子信息发烧客

Python从0到1丨图像增强及运算:形态学开运算、闭运算和梯度运算

华为云开发者联盟

Python 人工智能 华为云 企业号 2 月 PK 榜 华为云开发者联盟

BSN-DDC基础网络详解(二):快速接入指南

BSN研习社

BSN-DDC

架构训练营模块七作业

张建闯

架构实战营

JVM性能调优,分享些好用的内存分析神器

Steven

架构训练营模块8

张建闯

架构实战营

设计「业务」与「技术」方案

Java 架构 技术 业务

银行零售如何更贴近客户?是时候升级你的客户旅程平台了

Kyligence

数据分析 客户旅程

Hi3861编译烧录更快捷

HarmonyOS开发者

HarmonyOS

基于Verilog HDL的状态机描述方法

timerring

FPGA

万里数据库加入龙蜥社区,打造基于“龙蜥+GreatSQL”的开源技术底座

OpenAnolis小助手

开源 龙蜥社区 greatsql社区 万里数据库 生态适配

应用部署初探:微服务的3大部署模式

SEAL安全

微服务 企业号 2 月 PK 榜

图片竟能直接生成逼真音效?这AI模型也太神奇了吧!

人称T客

前端如何实现将多页数据合并导出到Excel单Sheet页解决方案|内附代码

葡萄城技术团队

数据库 前端 架构分布式

非代码的贡献也能成为Committer,我与DolphinScheduler社区的故事

白鲸开源

开源 开源社区 开源文化 开源软件 大数据 开源

对话 ChatGPT:现象级 AI 应用,将如何阐释「研发效能管理」?

LigaAI

人工智能 研发效能 openai ChatGPT 企业号 2 月 PK 榜

我的2022,从紫竹院到通惠河畔

虎妞先生

学习 前端 成长 年终总结

C++ 友元与运算符重载那些事

王玉川

c++ 编程语言 运算符 重载 friend

Java高手速成 | Hibernate的配置文件与JPA API的基本用法

TiAmo

hibernate jpa api 网关

数据同步gossip协议原理与应用场景介绍

京东科技开发者

架构 Consul fabric Gossip协议 企业号 2 月 PK 榜

OpenMMLab图像分类实战代码演示

IT蜗壳-Tango

CV OpenMMLab 图片分类

git中patch的用法

ModStart

探讨MySQL事务特性和实现原理

小小怪下士

Java MySQL 程序员 事务

2023年低代码发展新趋势

力软低代码开发平台

Flomesh Ingress 使用实践(四)TLS 透传

Flomesh

Kubernetes 服务网格 ingress Pipy 流量管理

如何用Apipost预执行脚本动态修改Query、Body、Header参数

不想敲代码

Postman 接口调试 API apipost

干货|PCBA丝印位号与极性符号的组装性设计

华秋电子

PCB dfm

给webpack提了一个pr之后......

虎妞先生

前端 webpack #开源

异步REST操作的处理_SOA_Boris Lublinsky_InfoQ精选文章