在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读者交流群)。

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

  1. 分析了 Stack Overflow、Reddit 等 9 个榜单,Python 第一的地位稳了!

    IEEE Spectrum 发布了 2018 年年度编程语言排行榜.IEEE Spectrum 编程语言排行榜一年发布一次,今年是其发布的第五年. IEEE Spectrum 对 48 种语言进行排行 ...

  2. Stack Overflow 的 HTTPS 化:漫漫长路的终点

    原文作者:Nick Craver 翻译作者:罗晟 & 狄敬超(沪江工程师) 原文地址:nickcraver.com/blog/2017/0- 本文为原创翻译文章,已经获得原作者授权,转载请注明 ...

  3. Stack Overflow技术报告给开发者哪些启示

    最近,国外著名的技术问答社区Stack Oeverflow发布了一个技术报告,里面包含了关于开发者对于技术好恶程度的调研结果,非常有意思,InfoQ也做了相关的新闻报道,不过里面更多的是数据,缺少了数 ...

  4. Stack Overflow是如何做应用缓存的

    首先要说下缓存是什么?缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多 ...

  5. Python超越Java,Rust持续称王!Stack Overflow 2019开发者报告

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」明日开启,扫码咨询 ↑↑↑ 作者 | 郭芮 出品 | CSDN(ID:CSDNnews) 导语:2019 年 Stack Overflo ...

  6. Stack Overflow: The Architecture - 2016 Edition(Translation)

    原文: https://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/ 作者:Nick Cra ...

  7. 取代 JavaScript!Python 成 Stack Overflow 最受质疑编程语言

    对于开发人员来说,哪些编程语言最受欢迎?哪些框架.包.函数和方法被提问的次数最多?哪种数据类型使用起来最痛苦?各个编程语言之间的问题有何不同?--本文中汇总了数百万个各个开发领域内的不同问题,挑选了1 ...

  8. 【07】函数调用:为什么会发生stack overflow?

    [计算机组成原理]学习笔记--总目录 [07]函数调用:为什么会发生stack overflow? 引言 一.为什么我们需要程序栈? 二.如何构造一个 stack overflow? 三.如何利用函数 ...

  9. 还敢随便抄?Stack Overflow上最火这段代码有Bug!

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 7 分钟. 作者 | Andreas Lundblad 译者 | 弯月     责编 | 欧阳姝黎 出品 | CSDN(ID: ...

最新文章

  1. 脚本运行java_shell脚本运行java程序jar
  2. 课程作业1:字符型强制转化为整型
  3. jvm内存溢出分析实践案例:javax.crypto.JceSecurity大量BouncyCastleProvider实例无法被回收
  4. 从0开始搭建ELK及采集日志的简单应用
  5. 位运算 c语言 头文件 linux,1. 位运算_C语言_C语言入门-Linux C编程一站式学习...
  6. 山东省中职信息技术c语言试题及答案,中职计算机专业C语言测试题
  7. Oracle DataGuard Study之--DataGuard FailOver案例
  8. [Remoting FAQ]Loading a Remoting Host On IIS得到BadImageFormatException
  9. 61组第二次团队作业
  10. NestedScrollView、ScrollView 加载完自动滑动至底部问题的解决方案
  11. Python 进阶——重访 list (二)
  12. JAVA中的继承和覆盖
  13. ireport在Java中不展示_编译错误:ireport with java;属性'uuid'不允许出现在元素'jasperReport'中...
  14. android电视开发远程开关机,一种电视电脑一体机及其实现远程开关机控制的方法...
  15. 如何生成javadoc文档(JDK帮助文档)
  16. win10cmd重置系统_win10怎么重置电脑 win10重置此电脑的方法【图文】
  17. CSS4.2.3 参考手册.CHM
  18. 微信好友只有昵称没有微信号_没微信号能找到人吗 只有微信昵称怎么找人
  19. HTML5设计网页动态条幅广告(Banner) 已经加上完整源代码
  20. 中国脑计划颠覆性创新之路九,进化的方向,脑科学,互联网和人工智能联合突破达尔文进化论局限

热门文章

  1. micropython微控制器_MicroPython:针对微控制器的Python
  2. axure怎么做手机app界面_iPhone11手机APP频繁闪退怎么办?
  3. php100视频教程2012,PHP100视频教程2012新版
  4. 声光调制器实验研究_脉冲光抽运原子钟研究取得进展
  5. java8电脑版安装包下载百度云_everything电脑文件搜索工具
  6. pb string最大长度_跑马备赛训练计划大盘点,助你跑出PB
  7. linux 编译报错 not a directory,Linux常见英文报错中文翻译
  8. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球
  9. 安卓手机玩游戏卡顿怎么解决_手机卡顿怎么办?教你3个实用解决方法,两分钟解决卡顿难题!...
  10. php的防csrf攻击,zblog php添加Token防止CSRF攻击