GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

Stack Overflow 通过关注性能,实现单块应用架构的扩展能力

2015 年 7 月 06 日

在 New York QCon 2015 大会上,David Fullerton 深入解析了如何使用 C#/ MS SQL 支撑 Stack Overflow 网站的单块应用架构,这个网站每月处理 40 多亿的用户请求。Fullerton 认为,关注性能就可以几乎免费地使网站具备应付高并发的扩展能力;同时,通过减少对外部服务的调用,SOA 开销(SOA tax) 得以避免。

Fullerton , Stack Exchange 的工程部副总裁,在演讲开篇就指出尽管 Stack Exchange 旗下网站使用的技术架构很平庸,但网站使用如此陈旧技术仍能运行良好的方法却很有趣。Stack Exchange 掌控并运营着几个社区类“问答”风格网站,包括广受欢迎的 Stack Overflow 开发者问答门户网。

Stack Exchange 团队完全以远程方式协同工作,即便团队成员在同一地点办公,公司也鼓励员工相互之间仅仅使用远程协同的方式,例如使用即时通讯工具和缺陷跟踪程序。Fullerton 说,正是由于公司保持一种“雇佣聪明员工并不妨碍他们”的心态,从而使系统管理员和全栈工程师组成一个高效团队,共同构建并维持网站平稳运行。

Stack Exchange 旗下的网站在设计时都使用了一种升级版单块应用(monolith plus)的架构,几乎所有的应用逻辑都由 C#的 Web 层以及 MS SQL 数据库实现。这个规则也有一些例外,例如标记相关逻辑已经从单块应用中提取成标记引擎服务,缓存服务则由几台 Redis 服务器提供,同时 ElasticSearch 服务器提供全文搜索功能。

开发团队将网站的应用程序部署到两个数据中心,从而增加系统的整体容错能力,纽约机房作为主数据中心,俄勒冈机房作为备援数据中心。开发团队以滚动部署应用的方式更新整个 Web 层的服务器,这种部署操作每天都会发生,从白天到晚上。新功能的测试由一组真实用户执行,这些测试用户则是由一系列特性标记自动选择出来的。

我们首先会在部分网站上尝试(新功能),并观察运行的情况。这种方法对我们很有效。我们网页的特性是在单个页面(问答页] 上有很高的读负载,而并不像其他网站的页面有那么多客户化的内容,而且我们有一个比较宽容的用户社区。

Stack Exchange 的研发理念是“先用我们熟悉的技能,度量问题,修复慢的地方”。最初的开发人员只了解 C#和 MS SQL,因此我们今天仍在使用这样的开发堆栈。早期的 Web 应用程序利用到几个现成的工具:ASP.Net MVC,Linq 到 SQL 的转换,MS SQL 全文搜索和内置缓存。Fullerton 表示,在 Stack Exchange,由于关注客户体验,并考虑到搜索引擎对于性能好的网站会有正向权重,所以性能是一个重要的功能特性。 Stack Exchange 通常都会在实际的负载下测试(不允许任何猜测和假设),开发团队会将性能问题当作务必尽快解决的缺陷。

整个网站架构有很好的并发处理能力。我们每月处理 40 亿次请求,峰值为每秒 3000 次,每天有 8 亿次 SQL 查询,峰值为每秒 8500 次。

Fullerton 说,随着时间的推移,初始技术栈中的主要部分已被取代:引入 Redis 以提供缓存,添加 ElasticSearch 以改善全文搜索能力,通过使用定制的中间语言生成框架来替代原有的实体层对象映射方式,从而提高 SQL 访问的效率,同时兼顾扩展性和新功能需求,从原有的单块应用中抽取出标签相关逻辑,形成独立的标签引擎服务。

工具对于识别和监控性能问题很有帮助,例如 miniprofiler 可以分析用户请求并检测性能瓶颈, Opserver 用于监控, Dapper 可以分解追踪请求。Fullerton 表示,对性能的关注会带来很多好处。

你可以通过优化性能而提升扩展能力(几乎免费)。单块应用的扩展能力超出你的想象。

Fullerton 的结论是,这种升级版单块应用的架构在 Stack Exchange 非常成功。尽管这种架构可能显得陈旧无聊,但团队坚持这种方式的过程非常有趣。微服务架构的风格可能在当今很流行,但 Fullerton 警告说,过度使用这种模式,就必须承担这种模式固有的各种 SOA 开销(SOA tax)。

SOA 不是唯一的成功之路。我们要知道自己的问题领域,在解决实际问题的过程中, 提取服务去解决实际困难,而不是虚幻地想象各种服务。

你可以在 QCon New York 会议网站上找到更多关于 David Fullerton 演讲“ Scaling Stack Overflow: Keeping it Vertical by Obsessing Over Performance ” 的信息。

查看英文原文: Scaling the Stack Overflow Monolithic App by Obsessing Over Performance


感谢丁晓昀对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015 年 7 月 06 日 07:502745

评论

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

第八周作业

李白

HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第4章CSS文本样式

Geek_8dbdc1

CSS

架构师训练营week8作业

小高

第八周作业

Geek_a327d3

初识 - DDD-CQRS

半亩房顶

DDD CQRS

第八周心得

方堃

week8 作业

a晖

第八周总结

李白

作业:链表交叉点

考尔菲德

HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第3章初识CSS

Geek_8dbdc1

CSS

一个文学青年的至暗时刻

半亩房顶

反思 就业

架构师训练营——第8周作业

jiangnanage

Week08作业

熊威

领域驱动设计 学习笔记

半亩房顶

DDD

数据结构&网络通讯原理

石刻掌纹

HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第5章CSS盒子模型

Geek_8dbdc1

CSS

哪些资源容易造成性能瓶颈

彭阿三

IntelliJ IDEA 2020.2正式发布,诸多亮点总有几款能助你提效

YourBatman

IDEA 新特性 IntelliJ IDEA

数据结构与算法、网络模型总结

2流程序员

作业-第八周

superman

Week08总结

熊威

Week8作业

丿淡忘

判断两单链表是否相交

石刻掌纹

week 08作业

Safufu

第八周课程总结

考尔菲德

EasyDL全新升级,文心(ERNIE)3项能力助力快速定制企业级NLP模型

百度大脑

人工智能 nlp 百度大脑

架构师训练营——第8周学习总结

jiangnanage

架构师训练营Week8作业总结

小高

架构师第八周

Tulane

从 1.9 到 1.11,聊聊 PyFlink 的核心功能演进(附 Demo 代码)

Apache Flink

flink

找出两个链表交点(golang版)

2流程序员

Stack Overflow通过关注性能,实现单块应用架构的扩展能力-InfoQ