阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

异步 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:075319
用户头像

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

关注

评论

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

大数据中心通过Perforce软件版本管理系统助力动力系统开发

龙智—DevSecOps解决方案

perforce 混合动力

如期而至-用户购买时间预测(上)

索信达控股

模型 购买预测 购买行为 精准营销

质量基础设施“一站式”服务平台开发,一站式检验检测服务平台

电微13828808271

QCon-OPPO数据平台Cloud Lake 降本增效实践

安第斯智能云

运维 后端 数据

复杂场景下,通信云服务商如何赋能开发者

融云 RongCloud

音视频 通信云 语音社交

网络安全之SQL注入深入分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 SQL注入

视镜:华为云媒体质量管理最新实践

华为云开发者联盟

音视频 华为云 媒体质量 视镜

【技术干货】前端性能优化——快速定位代码bug

云智慧AIOps社区

开源 大前端 技术分享 技术干货

Flutter 2 渲染原理和如何实现视频渲染

声网

flutter 大前端 音视频

直播:开发者如何抵达元宇宙

融云 RongCloud

开发者 元宇宙

风口之下,音视频应用出海的三大机遇

融云 RongCloud

音视频 通信 出海

智慧社区建设解决方案,智慧社区综合服务平台开发

电微13828808271

区块链农产品溯源系统开发,助力农业品牌打造

电微13828808271

取代FMEA风险评估:如何在敏捷世界中管理风险

龙智—DevSecOps解决方案

风险管理 FMEA

nginx负载均衡策略你知道多少?

恒生LIGHT云社区

负载均衡 服务器 ngnix

架构实战营4期第一模块作业

jialuooooo

架构实战营

EasyRecovery如何恢复md文件

淋雨

Camtasia

搭积木一样实现语音社交软件开发

融云 RongCloud

开发者 通信云 语音社交

Java 面向对象精讲【下】

XiaoLin_Java

面向对象 12月日更

愿当传播通信技术火种的普罗米修斯

融云 RongCloud

通信云 技术大会

控制台彩色输出

FunTester

Java 测试框架 Groovy FunTester Jansi

前端领域的数据状态统一管理机制

鲸品堂

大前端

服务器减少一半,TDengine在华自科技的落地实践

TDengine

数据库 tdengine 时序数据库

架构实战营模块一作业

Sindorei

「架构实战营」

数据分析中应该掌握的五个数学概念

好奇分析

数据分析 Excel 统计学 基本概念

如何用会声会影制作简约的倒计时片头?

懒得勤快

为什么说泛娱乐出海离不开这家公司

融云 RongCloud

音视频 通信云 社交 泛娱乐 出海

想在 KubeSphere 中进行自定义监控?来瞧瞧这

API7.ai 技术团队

云原生 API网关 监控工具 KubeSphere Apache APISIX

免杀技术的发展

喀拉峻

网络安全 安全 信息安全 免杀

如何为你的听众设计一张精密的地图

将军-技术演讲力教练

探秘持久内存(PMem)中无锁实现多线程安全的持久化数据结构

第四范式开发者社区

持久内存 PMem 多线程安全

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