【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

REST 的缺点是什么?

  • 2013-06-05
  • 本文字数:1792 字

    阅读完需:约 6 分钟

几年前,Ganesh Prasad 问道, Internet 比 REST 更基本吗?这些年,他不断围绕 REST SOA、以及更时新的云计算提出相关讨论,并且钟情于REST 的指导原则。然而,最近有人在 LinkedIn REST 架构师讨论组中的一片帖子中问道,“REST 的缺点是什么?”Ganesh 对此做了回复,然后又在其个人博客中重申了自己的观点

我不能说 REST 有“缺点”。它说到的都做到了,而且做得很好。但是,请记住 REST 架构的实现唯一使用的协议是 HTTP。我们可以肯定地想象 REST 在另一种传输协议上的实现,而且其中还包含诸多方面的增强。

接着,他谈到了四个可能改进的方面。值得一提的是,Ganesh 和许多人一样,将 REST 等同于 REST/HTTP,即基于 HTTP 的 REST:

  1. HTTP 是一个同步的请求响应式协议。这意味着它不能天然地支持服务端发起的通知(点对点),但这又是经常需要的。这就解释了为什么 REST 风格的应用程序中的回调需要使用应用层的设计模式,如 Webhooks。现在,我们有了 WebSockets 这样的双向传输协议,也许工业界应该考虑在其之上根据 REST 原则设计一款新的应用协议。” 这一点非常有意思,因为就在差不多一年之前,我们看到有些人甚至在探讨 WebSockets 和 REST 是否能够兼容的问题。
  2. Ganesh 认为,REST 社区从 Web Service 协议栈中至少能够学到一些东西:“这些协议都是基于核心的 SOAP 和 WS-Addressing 消息机制能力之上的端到端的协议”。过去,也有人提到过类似的建议。Ganesh 接着做了一个类比,他说 Web Service 之于 WS-Addressing、WS-ReliableMessaging、WS-SecureConversation 和 WS-Policy 好比 Internet 之于 TCP、IP 和 IPSec 等。Ganesh 认为,REST 的应用幂等性可以更好地实现可靠性(尽管并没有提到如何更好),而且可以找到 REST 事务的替代方案,但是他仍然留下了一个问题:

剩下的问题是安全。WS-SecureConversation 和 WS-Security 是可路由的,它们不同于 SSL/TLS,而后者却是 REST 唯一的安全机制。有了 WS-Sec*,就可以对消息进行部分加密,留下一些明文用于基于内容的路由和分支切换。这是 REST 缺乏对应的优秀方案的地方。SSL 是点对点的,不受代理检测,并且违反了 REST 原则。REST 对此只能忍受。

这一说法也非常有意思,我们也看到了有的人提出了一些想法,如 Resteasy 的 Bill Burke ,他提议, REST 需要更好地实现安全的方法

Ganesh 继续谈到了 REST 对一般性 QoS 的问题:

REST 不能支持这些一般性 QoS 背后的原因是,它们都需要维护“会话状态”。有状态(statefulness)存在明显的缺陷(如,影响可伸缩性和错误恢复),但是随着 Redis 之类的宣称常数时间(即 O(1))和高性能的 NoSQL 存储的出现,就有可能将会话状态从内存中转移到这样的存储中,因而可支持在多个节点间共享会话,进而可以满足 QoS 的需要。

回到 Ganesh 谈到的另外两点:

  1. 他认为,HTTP 的动词太少,尤其对于需要做点对点交互的场景。他建议:“INCLUDE(将资源加入到某个资源集合中并返回服务端设定的 URI)、PLACE(使用客户端指定的 URI 向资源集合中添加资源)、REPLACE(全部替换)、FORCE(PLACE 或 REPLACE)、AMEND(部分更新,它是一个容器动词,为一个资源子集指定一个或多个动词)、MERGE(通过提供的表述合并部分资源)、RETIRE(比 DELETE 更好)和 SOLICIT(替换 GET,它也是一个容器动词,用于告知响应端对发起方的资源做些什么,因为现在是点对点的场景了)
  2. HTTP 合并了应用层和传输层的状态码(如,304 Not Modified[未修改] 和 400 Bad Request[无效请求];407 Proxy Authentication Required[需要代理认证] 和 502 Bad Gateway[无效网关])。 REST 在另一个协议上的实现应该更清晰地隔离应用层协议和传输层协议。HTTP 承担了双份工作,因此其结果也往往不尽完美。

参照一下 HTTP 2.0 的初始草案,就能发现它不可能完全采纳 Ganesh 的建议。然而,Ganesh 本人在过去 5 年里好像一直致力于提出一个新规约:

我正在编写一个称作 Internet Draft 的新应用协议,它可以绑定任何传输(发布 / 订阅、异步点对点或同步请求 / 响应)。该协议是被我称为 ROMA(面向资源 / 表述的消息传输架构)的新型分布式计算架构的一部分,它不仅包含数据模型和消息传输 API,还包含更高级的功能(QoS、描述和流程协作)

该规约发布之后,如何解决这些已知的问题?是否能够获得 REST 社区的积极响应?将是很有意思的看点。


查看英文原文: What Are The Drawbacks Of REST?

2013-06-05 01:5314772
用户头像

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

关注

评论

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

架构师训练营第二期 Week 10 总结

bigxiang

极客大学架构师训练营

架构师训练营第十四周课程笔记及心得

Airs

第八周-作业1

Mr_No爱学习

架构师训练营第二期 Week 10 作业

bigxiang

极客大学架构师训练营

第 10 周 系统架构作业

心在那片海

NO.002-Java并发编程之多核硬件架构

葛一凡

操作系统 设计原则 硬件架构

《Python数据科学:关于使用Python处理数据需要了解的终极指南》PDF免费下载

计算机与AI

Python 数据科学

Week10 作业

evildracula

训练营第十周作业

大脸猫

极客大学架构师训练营

第 10 周 系统架构总结

心在那片海

第十周总结

孤星

TypeScript | 第七章:配置文件说明

梁龙先森

typescript 大前端 编程语言 七日更

第 10 周作业

Steven

行业寒冬:程序员怎样优雅度过35岁中年危机?跳槽薪资翻倍

欢喜学安卓

android 程序员 面试 移动开发

提问开启创新-激发团队创新的提问法

Alan

个人成长 创新 团队文化 七日更 28天写作

工具词典:数据

lidaobing

数据 28天写作

第五章学习总结

简简单单

Code Review实践

Albert

Code Review 七日更

讲的真透彻!Android开发了解这些自然无惧面试,成功入职阿里

欢喜学安卓

android 程序员 面试 移动开发

架构训练营第九周作业

一期一会

微服务 dubbo

Week 10 模块分解

evildracula

学习 架构

架构师训练营 第3期 第5周 作业和总结

ihiming

第十周作业

孤星

wildfly 21中应用程序的部署

程序那些事

程序那些事 wildfly wildfly21 应用程序部署 应用程序配置

第八周-学习总结

Mr_No爱学习

计算机专业必看!记录一次腾讯Android岗面试笔试总结,讲的明明白白!

欢喜学安卓

android 程序员 面试 移动开发

冰河是谁?到底是干嘛的?

冰河

程序员 程序人生 架构师 冰河 冰河技术

Dubbo 微服务调用过程

梧桐

训练营第十周总结

大脸猫

极客大学架构师训练营

第十周作业

hunk

极客大学架构师训练营

架构师训练营 - 大作业一

lucian

REST的缺点是什么?_REST_Mark Little_InfoQ精选文章