【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

Kevin Montrose 谈 StackExchange API 的历史与错误

  • 2011-08-28
  • 本文字数:1158 字

    阅读完需:约 4 分钟

为现有站点创建公开 API 总是一件很有风险的事情,而且 StackExchange 的开放编辑策略则将这种风险更进了一步。在最近发表的一系列文章中,Kevin Montrose 谈到了关于 StackExchange API 的决策以及从中得到的经验与教训。

在开始设计 API 时,他们就已经设定好了目标与约束。比如说,他们的一个主要目标就是“让开发者无需查阅其站点”。StackExchange 成员所遵循的内容许可协定 cc-wiki 可以让第三方重用站点上的内容,但在该 API 发布前,并没有很好的方式进行批量访问。最大的一个约束在于 API 是只读的, Kevin 说到

显然,写操作是非常危险的。不仅仅出现在有 Bug 的认证上,比如有人以 Jeff Atwood 登录,删除了大量的内容,这会让我寝食难安。更重要的是(也是更危险的),在疏于指导的情况下,这会导致人们发布大量的垃圾信息。 我们为了确保 Stack Exchange 内容的质量付出了艰辛的努力(我们关闭了不满足标准的整个站点)。未经深思熟虑的写操作 API 会导致很多问题,因此我们在 1.0 中并没有将其添加进来。不过,我们有可能在 3.0 中将其添加进来。

Kevin 提到了一些关键的设计点:

  • 矢量化请求:“无论何时,如果我们能接受一个 id,那么我们就可以接受 100 个”
  • 压缩的响应:我们使用 GZIP 对响应进行压缩,即便客户端并没有要求压缩我们也会这么做
  • 排序与过滤:“大多数端点可以接收 sort、min、max、fromdate 以及 todate 参数进行查询”

但人们更感兴趣的是他们所犯的错误。比如说,默认情况下返回总数的决定。

总数对于分页控件的渲染很有用,count(*) 查询就是如此(比如说人们对我的评论的投票数等等);从这个角度来说,total 字段本身并没有错。但默认情况下返回它则毫无疑问是不对的。 问题在于总数是有用的,但却并非总是如此。很多时候,查询形式是这样的:“返回标记为 X 的最近的 N 个问题 / 答案 / 用户,或是返回你所拥有的前 N 个问题 / 答案并且根据 S 排序”。这些常见的查询与总数没有任何关系,但每次却都要返回总数,这就需要付出代价。

另一个问题在于对隐式类型的使用。相对于显式说明返回哪个数据类型来说,客户端开发者需要从现有的字段中进行推断。无论在何种语言中这都是非常恼人的问题,但对于静态类型语言来说更是如此,因为开发者需要将这些无名类型映射到实际的类上。

暂且不表其他的错误,让我们使用 Kevin 提到的最后一个错误来作为结论,那就是浪费的请求量。为了防止过度使用 API,他们使用了与 Twitter API 一样的配额。

这实在是太浪费带宽了,与 Twitter 不同,我们的配额还是相当慷慨的(每天 10,000 个请求)并且不是动态的。对于 total 字段来说,很多应用并不需要关注配额(除非超过了,但这种情况很少发生),但如果每次请求都获取该字段则需要付出代价。

查看英文原文: Kevin Montrose on the History and Mistakes of the StackExchange API

2011-08-28 09:171096
用户头像

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

关注

评论

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

TCP 协议灵魂问题,巩固你的网路底层基础

Hive HMS Canary 时间较长异常分析

笨小康

大数据 hadoop hive

数据中心决策如何快人一步?一块大屏轻松实现3D数据可视化

一只数据鲸鱼

物联网 数据中心 数据可视化 IDC 机房管理

架构师week12作业

Geek_xq

DIY一款4路USB转TTL串口调试模块

不脱发的程序猿

DIY 电路设计 硬件设计 USB电路 USB转TTL

DPDK大页内存原理

赖猫

Linux DPDK

15. Python 程序运行速度如何提高十倍?第一遍滚雪球学 Python 收工

梦想橡皮擦

Python 2月春节不断更

对DevOps的九大误解,是时候纠正了!

禅道项目管理

开源 DevOps 敏捷 自动化 持续交付

翻译:《实用的Python编程》01_07_Functions

codists

Python 人工智能 后端 数据结构与算法 函数

如何读懂CNN、BBC、经济学人、卫报、纽约时报?看完这本经典即可事半功倍!

wbliu85

学习 英语

【STM32】ST-LINK下载器下载后需复位,程序才运行的问题

AXYZdong

硬件 stm32 2月春节不断更

技术秘籍 | 如何简单优雅的适配textview行间距?

百度开发者中心

大前端 TextView

LeetCode题解:1143. 最长公共子序列,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

最新Hadoop的面试题总结

大数据老哥

日记 2021年2月19日(周五)

Changing Lin

2月春节不断更

CoralCache:一个提高微服务可用性的中间件

华为云开发者联盟

数据库 微服务 中间件 内存 CoralCache

【LeetCode】最大连续1的个数三Java题解

Albert

算法 LeetCode 2月春节不断更

万字长文:解读区块链7类共识算法

华为云开发者联盟

区块链 公有链 拜占庭容错 共识算法 公式算法

使用 Tye 辅助开发 k8s 应用竟如此简单(三)

newbe36524

Docker 微服务 k8s dotnet

Elasticsearch Search API 基础语法

escray

elastic 七日更 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

一、MongoDB简介

Kylin

数据库 mongodb 学习 七日更 二月春节不断更

竞猜商城系统软件制作

v16629866266

GitHub上爆火的Java性能优化100+小技巧!(干货建议收藏)

Java架构师迁哥

开源数据库管理系统现在比商业产品更受欢迎

PostgreSQLChina

数据库 postgresql 软件 开源社区

Kafka.01 - 简介

insight

kafka 2月春节不断更

linux内核协议栈 邻居协议之ARP协议处理初始化

赖猫

Linux 协议栈 Linux内核

前端学习总结,经验分享,项目经验分享过程

我是哪吒

学习 程序员 Vue 大前端 2月春节不断更

地表建筑物识别Dayo1

IT蜗壳-Tango

七日更 2月春节不断更

架构师week12心得

Geek_xq

诊所数字化:就诊流程标准化和产品SOP设计

boshi

数字化转型 医疗 七日更

让虞书欣、李诞拍到停不下来!AR+AI双引擎的互动小游戏,如何打开IP新玩法?

爱奇艺技术产品团队

Kevin Montrose谈StackExchange API的历史与错误_SOA_Jonathan Allen_InfoQ精选文章