写点什么

Dropbox 发布具有可伸缩性的 API

  • 2017-04-10
  • 本文字数:1541 字

    阅读完需:约 5 分钟

在我们构建新的 API 时,人们通常会在未来的不可知和对棘手问题的预优化之间感到迷茫。Dropbox 也不例外。构建 API 时,Dropbox 开发人员必须考虑到作为一家公司可能会出现的快速增长,同时也需要认识到,他们对 API 做出的任何变更,随着时间的推移总会被一部分 API 消费者认为是在倒退。那么他们最终是怎么解决这些问题的?答案是三思而后行。

Leah Culver 之前曾是 Dropbox 的一名开发人员,他去年发表了一篇博文,文中详细阐述了Dropbox 针对自身的API,从V1 版本到V2 版本的艰难升级过程。他们的第一个重大决定是,是否让现有的API 适配日益增长的消费者需求,因为他们扩展了Dropbox Pro 和核心功能。他们的决定主要围绕着与API 消费者的“共生关系”展开,Culver 将其描述为应对API 增长的秘密武器。他们面临两种需求,一个是以一种灵活的方式与其他公司应用集成,一个是不造成混乱,最终前者战胜了后者,连通性比之前的任何时刻都要来得重要。一项最新的Google调查显示,有四分之一的用户通过搜索引擎发现应用程序,根据 Statista 的报告显示,大约 2 到 3 百万个应用程序在安卓和苹果应用商店可供下载,对于这些应用程序来说,搜索可见性是非常重要的。越来越多的用户不愿意因为要使用相关功能而安装多个应用程序,而错过扩展 Dropbox API 的机会意味着与第三方应用程序集成度的下降,最终导致 Dropbox 用户的减少

然而,在创建 Dropbox API 的 V2 时,Dropbox 有关闭的趋势。Dropbox 创建了自定义的 JSON,而不是使用 REST 范式、GraphQL 或者套接字服务,这样很大程度上偏离了 REST 或 HTTP 的准则。不使用通用的 HTTP 状态码,Dropbox 转而针对所有的错误使用 409 错误码,并在消息体里附带了自定义的错误消息。Dropbox 的 API 处理层是一个 HTTP POST 方法。不需要使用请求消息的 URL 或消息头,Dropbox 接收一个 JSON 消息体作为输入,然后返回一个 JSON 消息体,不管执行的 API 操作是检索还是修改状态。

在伸缩性方面,Dropbox 的方式有几处优点和缺点。一方面,Dropbox 不受 REST 的死板、僵化天性的限制,这类限制不适用于所有的数据使用案例,所以常常让人完全误解。Steve Klabnik,RUST/RUBY 贡献者,同时也是 Rust for Rubyists 的作者,他声称,99.99% 的RESTful API 没有完全符合Roy Fielding 的REST 思想。这一论点打破了过往认为RESTful 规范可以让Dropbox 的API 很容易适配未来的应用场景的论调,因为他们不符合任何一套模型。然而,对应于他们所获得的灵活性,他们也失去了结构性和大多数开发人员的易理解性。

HTTP 状态码是一个通用标准,负责与 Dropbox API 集成的开发人员会很容易理解和使用,响应报文里面的自定义状态码不仅仅需要额外的字符串处理程序,而且也难以从编程角度理解不同的错误状态。在提供强大的 API 开发可能性的同时,混合使用 GET 和 POST 原语,分不清来自客户端的调用哪些是改变对象状态的操作,哪些是存粹的查询操作,这种集成方案具有潜在的风险。大部分自定义 API 架构要求掌握大量有关 Dropbox API 的领域知识,而不仅仅是把它当成一个简单的 API 看待。Dropbox 的开发人员 F. Metsys 写了一篇博文,在文章中他描述了Dropbox 的方式:“我们伺机选择了HTTP 的优点,而不会将自己绑定在它上面。”这意味着Dropbox 的API 可以提供其他API 无法提供的特性和数据可见性,或者也可能意味着一种令人困惑且紧凑的集成过程。只有时间可以告诉我们,Dropbox API 的ad hoc 结构对于整体的增长和伸缩是有利还是有害。

原文地址: Evolving APIs for Scale with Dropbox


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-10 19:001810
用户头像

发布了 50 篇内容, 共 29.0 次阅读, 收获喜欢 40 次。

关注

评论

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

带领全网朋友,完成粉笔登录加密分析,再次换种玩法

梦想橡皮擦

Python 爬虫 7月月更

【Docker 那些事儿】容器网络(上篇)

Albert Edison

Docker Kubernetes 容器 云原生 7月月更

mysql数据表查询

乌龟哥哥

7月月更

通过Dao投票STI的销毁,SeekTiger真正做到由社区驱动

股市老人

深度学习-多维数据和tensor

AIWeker

7月月更 多维数据

常见链表题及其 Go 实现

宇宙之一粟

链表 7月月更

LeetCode 242:有效的字母异位词

武师叔

7月月更

Android热更新调研汇总

沃德

android 程序员 7月月更

解读《深入理解计算机系统(CSAPP)》第12章并发编程

小明Java问道之路

Java 后端 并发 csapp 7月月更

初学者如何快速的上手Linux命令,这34条新手必会的命令一定得会!

wljslmz

Linux 7月月更

SDL图像显示

柒号华仔

7月月更

Android实现无序树形结构图,类似思维导图和级联分层图(无序,随机位置)

芝麻粒儿

android 7月月更

【LeetCode】滑动窗口的平均值Java题解

Albert

LeetCode 7月月更

zookeeper-认识watcher

zarmnosaj

7月月更

JavaScript DOM编程艺术笔记

程序员海军

前端 DOM 7月月更

还在为处理事务烦恼吗,要不试试Spring是如何处理业务的

Java学术趴

7月月更

分库分表

ES_her0

7月月更

值得收藏的ArkUI框架三方组件【系列1】

坚果

HarmonyOS Open Harmony 7月月更

队列的链式表示和实现

工程师日月

算法 7月月更

关于目前流行的 Redis 可视化管理工具的详细评测

宁在春

redis 7月月更 Redis 可视化工具

【萌新解题】三数之和

面试官问

面试 LeetCode

Block 的分类

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

数据库的主从分离

ES_her0

7月月更

软核微处理器

贾献华

7月月更

函数初认识-上

芒果酱

C语言 7月月更

mysql进阶(六)模糊查询的四种常见用法介绍

No Silver Bullet

MySQL 7月月更 模糊查询

为什么加工数据指标

奔向架构师

数据仓库 7月月更

Pyodide 中实现网络请求的 3 种方法

OpenHacker

Python pyodide

jQuery 操作元素

Jason199

jquery js 7月月更

通过Dao投票STI的销毁,SeekTiger真正做到由社区驱动

鳄鱼视界

Android ANR和OOM

沃德

android 程序员 7月月更

Dropbox发布具有可伸缩性的API_语言 & 开发_Margot Krouwer_InfoQ精选文章