王天,2005年7月加入Google,从事移动搜索、新闻搜索、搜索质量等工作;2011年3月加入Twitter搜索部门,工作至今。他主要带领Twitter的搜索质量团队,改进实时搜索产品。 首先,王天通过一组数字分享了Twitter的一些信息:
Twitter是一个和世界息息相关的实时信息平台,经常会遇到一些可预测或不可预测的事件,从而面临很大压力。 可预测的,比如:
不可预测的,比如:
在去年的奥斯卡颁奖典礼现场,主持人Ellen Lee DeGeneres在Twitter上发了一张全明星自拍照,很多人去搜索、转发,给Twitter造成很大压力,致使系统宕机一段时间。之后,很多人又会去搜索Twitter宕机情况,情形进一步恶化。当遇到峰值无法应对的情况,则会出现Twitter特有的报错页面Fail Whale。 Twitter的技术历史:从远古到现代从2006年到2015年,回顾Twitter架构的十年演进之路,可以大概分为远古、古代、近代和现代4个时代来看。 1.远古时代最初创办时,创始人Jack Dorsey考虑过用Python、C和OCaml编写。不过机缘巧合,他找到了Ruby on Rails的核心贡献者Florian Weber。所以Twitter选择了用RoR实现。 2.古代随着Twitter用户规模不断增长,其Ruby on Rails部署规模已经是世界第一,最多时机器达到3000台。如图所示,所有逻辑都在Monorail中。当时有超过200名工程师往里面check in代码。难以加入新功能,发布周期很长。 这个架构存在的问题是:
当时没有很好地挺过2010年世界杯的考验。 技术债累积迅速,这也是很大的一个问题。 3.近代这一阶段可以用两张图表示。 为减少耦合,对系统进行拆分。为提高效率,用Scala重写了服务器。在网络异步编程方面,开发了Finagle,这是基于Netty的一个异步编程库,也是用Scala编写的。存储方面,尝试创建较为高级的数据服务。 经过进一步分解,Monorail逐渐被分离出来。更多业务被分解出来;团队围绕模块组织。 这个时期最重要的事情就是Monorail退休了。整个系统从Ruby平台迁移到JVM上。单机QPS处理能力从200~300提高到10000~20000,延迟减小到1/3;减少了90%资源使用。 4.现代:产品系统和周边支持走到这一步,实际经过了非常多的系统拆分。时至今日,Twitter已经搭建起完整的工程生态。 回顾发展历史,服务化是很重要的变化。最初,所有的东西都在一个大系统中,知识无法压缩,开发人员要关注很多东西;而在服务化之后,开发人员可以将精力放到具体的业务逻辑上,同时享受质量可以预测的服务。 下面再用一张图回顾一下Twitter这10年的技术演进史。 纵观拆分过程,可以总结出逻辑存在的不同形式。逻辑放到一起,就是单体结构。通过关注点分离,慢慢拆开,将逻辑拆到不同的模块中。通过服务化或平台化,可以将逻辑放到服务或平台中。具体如下图所示。 服务、平台和技术三者是可以相互转化的。红色的路径比较理想,而绿色则比较糟糕。
当把逻辑变成一个服务、技术或者平台时,这时候要慎重考虑,以对待顾客的方式对待使用该服务的同事。那么,如何当好一个服务生呢? 有几条要领:
为方便他人使用,你可能需要提供设计文档、上手文档、示例代码、监测工具,并提供客户支持,还要协调未来功能规划,等等。 对于自己的服务、平台或技术,还要持之以恒地推广。包括推广你的服务和实践;扩大其用户群,增加采纳率;思考和类似服务共生和竞争的关系。 一些设计底线:
在完整的工程生态中,有一些是幕后英雄: 它们和产品并没有太大的关系,主要是语言支持、编译构建等,但是这些东西是工程师使用最多的。提高这些东西的效率实际上对整个工程效率影响非常大。 假设一个工程师一年工作2000小时(250天): 工程支持消耗的资源有限,但是可以让大部分工程师把精力用在刀刃上。 工程师的效率模型: 再来看一下Twitter的语言支持演变: 可以看到后面在收缩。语言过多还是会影响高效沟通。应该尽量减少。 Twitter的代码库和编译系统演进: Twitter最开始有多个代码库。现在是单一repo,统一编译。其优势是,开发者能看到最新的、所有的东西。代码对所有人可见,可以直接协作。不过代码量非常庞大的情况下,这么做成本也非常高,像Twitter就自己修改了git之类的工具。可以说这是一个哲学选择。 其他工具:
开源: Twitter有很多项目都在github.com/twitter上开源了。
|