看StackOverflow如何用25台服务器撑起5.6亿的月PV(3)

关于 Dapper 无编译器校验查询与传统 ORM 的对比。使用编译器有很多好处,但在运行时仍然会存在 fundamental disconnect 问题。同时更重要的是,由于生成 nasty SQL,通常情况还需要去寻找原始代码,而 Query Hint 和 parameterization 控制等能力的缺乏更让查询优化变得复杂。

编码

流程

大部分程序员都是远程工作,自己选择编码地点

编译非常快

然后运行少量的测试

一旦编译成功,代码即转移至开发交付准备服务器

通过功能开关隐藏新功能

在相同硬件上作为其他站点测试运行

然后转移至 Meta.stackoverflow 测试,每天有上千个程序员在使用,一个很好的测试环境

如果通过则上线,在更广大的社区进行测试

大量使用静态类和方法,为了更简单及更好的性能

编码过程非常简单,因为复杂的部分被打包到库里,这些库被开源和维护。.Net 项目数量很低,因为使用了社区共享的部分代码。

开发者同时使用 2 到 3 个显示器,多个屏幕可以显著提高生产效率。

缓存

缓存一切

5 个等级的缓存

1 级是网络级缓存,缓存在浏览器、CDN 以及代理服务器中。

2 级由 .Net 框架 HttpRuntime.Cache 完成,在每台服务器的内存中。

3 级 Redis,分布式内存键值存储,在多个支撑同一个站点的服务器上共享缓存项。

4 级 SQL Server Cache,整个数据库,所有数据都被放到内存中。

5 级 SSD。通常只在 SQL Server 预热后才生效。

举个例子,每个帮助页面都进行了缓存,访问一个页面的代码非常简单:

使用了静态的方法和类。从 OOP 角度来看确实很糟,但是非常快并有利于简洁编码。

缓存由 Redis 和 Dapper 支撑,一个微型 ORM

为了解决垃圾收集问题,模板中 1 个类只使用 1 个副本,被建立和保存在缓存中。监测一切,包括 GC 操。据统计显示,间接层增加 GC 压力达到了某个程度时会显著的降低性能。

CDN Hit 。鉴于查询字符串基于文件内容进行哈希,只在有新建立时才会被再次取出。每天 3000 万到 5000 万 Hit,带宽大约为 300GB 到 600GB。

CDN 不是用来应对 CPU 或I/O负载,而是帮助用户更快的获得答案

部署

每天 5 次部署,不去建立过大的应用。主要因为

可以直接的监视性能

尽可能最小化建立,可以工作才是重点

产品建立后再通过强大的脚本拷贝到各个网页层,每个服务器的步骤是:

通过 POST 通知 HAProxy 下架某台服务器

延迟 IIS 结束现有请求(大约 5 秒)

停止网站(通过同一个 PSSession 结束所有下游)

Robocopy 文件

开启网站

通过另一个 POST 做 HAProxy Re-enable

几乎所有部署都是通过 puppet 或 DSC,升级通常只是大幅度调整 RAID 阵列并通过 PXE boot 安装,这样做非常快速。

协作

团队

SRE (System Reliability Engineering):5 人

Core Dev(Q&A site)6-7 人

Core Dev Mobile:6 人

Careers 团队专门负责 SO Careers 产品开发:7 人

Devops 和开发者结合的非常紧密

团队间变化很大

大部分员工远程工作

办公室主要用于销售,Denver 和 London 除外

一切平等,些许偏向纽约工作者,因为面对面有助于工作交流,但是在线工作影响也并不大

对比可以在同一个办公室办公,他们更偏向热爱产品及有才华的工程师,他们可以很好的衡量利弊

许多人因为家庭而选择远程工作,纽约是不错,但是生活并不宽松

办公室设立在曼哈顿,那是个人才的诞生地。数据中心不能太偏,因为经常会涉及升级

打造一个强大团队,偏爱极客。早期的微软就聚集了大量极客,因此他们征服了整个世界

Stack Overflow 社区也是个招聘的地点,他们在那寻找热爱编码、乐于助人及热爱交流的人才。

编制预算

预算是项目的基础。钱只花在为新项目建立基础设施上,如此低利用率的 web server 还是 3 年前数据中心建立时购入。

测试

快速迭代和遗弃

许多测试都是发布队伍完成的。开发拥有一个同样的 SQL 服务器,并且运行在相同的 Web 层,因此性能测试并不会糟糕。

非常少的测试。Stack Overflow 并没有进行太多的单元测试,因为他们使用了大量的静态代码,还有一个非常活跃的社区。

基础设施改变。鉴于所有东西都有双份,所以每个旧配置都有备份,并使用了一个快速故障恢复机制。比如,keepalived 可以在负载均衡器中快速回退。

对比定期维护,他们更愿意依赖冗余系统。SQL 备份用一个专门的服务器进行测试,只为了可以重存储。计划做每两个月一次的全数据中心故障恢复,或者使用完全只读的第二数据中心。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/3d9df25ed8477d7f173ad0bb0ed2a62e.html