NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:5314777
用户头像

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

关注

评论

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

运用上游思维的七个思路

石云升

读书笔记 8月日更 上游思维

一群人的战斗

神策技术社区

编程 代码

如何在FL Studio中对整首歌曲音量进行调整

懒得勤快

【音视频】弱网下实时视频的极限通信

声网

音视频 视频处理 视频压缩

数据上报方式是否存在最优解?

神策技术社区

编程 数据

vue入门:简单指令介绍

小鲍侃java

8月日更

智能时代的信任口诀:让计算远离算计

脑极体

深耕基础软件,华为开源加速“新全球化

科技热闻

事事请示是不靠谱的表现

boshi

团队管理

DAPP智能合约搭建|DAPP波场智能合约开发

量化系统19942438797

智能合约 dapp

超级人脉:让巴菲特老爷子告诉你圈子的重要性

非著名程序员

人脉 认知提升 思维 8月日更

Python代码阅读(第10篇):随机打乱列表元素

Felix

Python 编程 Code Programing 阅读代码

数据同步系统重构实践

Qunar技术沙龙

数据库 ES canal 数据同步 Kafk

交易所市值管理机器人开发

Geek_23f0c3

去中心化交易所系统开发 市值管理机器人系统开发 做市机器人 去中心化市值管理机器人

学习笔记: JPA与Hibernate

yhrivory

数据库 hibernate jpa ORM spring data

你的日志打印对了么?

神策技术社区

数据分析 日志

Linux云计算-使用 MyCat 实现 MySQL 主从读写分离

学神来啦

MySQL 数据库 Linux 运维

漏洞挖掘的快乐你想象不到

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

MySQL 字段NOT NULL

一个大红包

8月日更

JAVA对于文件IO操作的支持

卢卡多多

Java 文件 io 8月日更

架构实战营 毕业总结

Dylan

架构实战营

区块链交易所搭建,币币交易系统搭建

一个小而美的 Swift 框架:Then

fuyoufang

swift iOS Developer 8月日更

架构实战营 - 模块五作业

李东旭

「架构实战营」

从小白程序员到大厂高级技术专家我看过哪些书籍?

冰河

学习 程序员 面试 程序人生

云原生-工作流引擎Zeebe

QiLab

云原生 k8s cncf BPM zeebe

你的登录接口真的安全吗?快看看你有没有中招!

xcbeyond

安全性 8月日更

面向对象的原则是普遍适用么?

escray

学习 极客时间 如何落地业务建模 8月日更

借助云网融合优势,某省运营商打造下一个十年增长引擎

BoCloud博云

云管理

手势事件采集究竟有多难?

神策技术社区

ios 手势

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