BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

异步REST操作的处理

| 作者 Boris Lublinsky 关注 1 他的粉丝 ,译者 马国耀 关注 1 他的粉丝 发布于 2009年7月11日. 估计阅读时间: 4 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

那服务端要什么时候才能不再保存状态了呢? by 陈 实

很明显,因为查询是客户端发起的,所以在客户没有查询时,就算运算结束了,那个状态与运算结果还是要继续保存,这就会造成服务端要有特定的机制去保存这些状态与运算结果,现在问题就是,在什么情况下服务端可以不再保存某个特定的状态与结果了。

Re: 那服务端要什么时候才能不再保存状态了呢? by cheng junwei

这种情况下服务器会存在被攻击的风险啊,很容易就会被资源耗尽.

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT