最新公告:
军事热点

地址:

电话:

传真:

手机:

邮箱:

军事热点

当前位置:主页 > 军事热点 >

Go -- 今日头条架构 - ma_fighting - 博客园

文章来源:未知 更新时间:2018-06-13 11:23

今天给大家分享今日头条架构演进,前面几位讲师讲了很多具体的干货,我的分享偏重基础设施及架构思路的介绍,我们想法是通过提供更好的基础设施,帮助架构做更好的迭代。迭代速度。迭代速度对于大公司来讲相对没那么重要,规模比较大,生存压力相对小一点,但相对中型小型公司来讲,迭代速度是必须要保证的,时间窗也是一个决定能否成功的重要因素;今日头条发展特别快,只有 4 年的历史,从人员数量和规模增长来看非常快,在稳定性可用性方面压力比较大,一方面需要快速把业务实现,但在另外一方面,类似这些高可用的问题会经常骚扰工程师:上线就挂、运营活动量大服务崩溃、单机性能顶不住、一个小服务上线把核心服务搞挂了类似这些问题,技术团队需要如何更好的去应对?先补充下我对架构演进的理解,在不同阶段的公司都会面临各种压力。小公司压力可能是业务没起来,QPS 很低,要做优化也没有环境及条件;当公司大了,服务器可能已经不是问题,但你要不断考虑调优及应对访问压力,改善基础设施以提供更稳定的开发环境。所以说架构演进是持续一个过程,没有终点。为什么今日头条有这么大的压力?今日头条增长速度是比较快的,从上图可以看出,现在公司已有 4 年,2014 到 2016 年每年都是 DAU 翻番。这对业务挑战是非常大,规模上来以后,我们原有的架构难以做到线性扩展,部分能线性扩展的服务,问题也比较多,业务增长太快,后端压力比较大。软件架构有一个问题,它改动的周期相对比较长。架构的模式思路定下来,随着业务的增长,包袱越来越大。做过基础设施的人都有这样的体验:有一个好的想法很容易,但做一个好用软件就有很多的困难。技术改造是漫长的,以年为单位。所以这个时候只能让架构迭代更快一点。最后,不要企图做特别完美的架构,我们只要保持敏捷演进就好了。今日头条刚开始做的时候,就是一个简单 Web 应用,搭个数据库,把业务实现就行了。头条最开始的优势是推荐引擎,还有另外一套数据挖掘和离线计算。在线的服务在前端相对来讲模式还是比较清晰的,三层就搞定了。业务刚开始起来的时候,没什么问题,访问增大水平扩展一下就可以解决。跟大部分公司的架构演进历史非常相似,当上个版本遇到一些性能问题后,最简单就做一些拆分。优化的过程中,那一块太重了就从代码上进行拆分。上图中,A、B 和 C 是不同的业务,刚开始代码是一起的,演进的过程中,迭代一年或者两年的产品,异构去拆其实挺痛苦。前面时代的架构,基本上没考虑太多的人员或者规模上的发展,刚开始也没有专门的人做架构优化,很多人都扑在业务上,把功能点加上。比如推荐的效果不好,就加强推荐,每块都没有专门的的人去考虑整体架构去怎么组织规划。到了去年,每个季度做的预算,到第二个月机器都用完了。高峰的时候有 60% 到 70% 的压力,这里涉及有两个问题:第一个问题,有些地方是性能衰减的问题;另外一个,业务压力太大。架构团队需要想办法变得更快,即使出现访问问题,压力大,机器不够,也要让我们的服务有所保证。业务一直在快速前进,包袱是比较沉重,改造的成本比较高。基于这些问题,谈下我们下一阶段的思路,做微服务。现实中微服务的关键是自治。虽然微服务是自治自包含,但也需要有一个层级。比如你提供的服务是外面公司提供的,微博提供的服务,你不能够要求微博为你得服务去做更改。微服务要有界限,在公司层面,不能让它过于独立,过于独立会增加沟通上的成本。基础设施和规范最好能复用。架构必须要落地成具象的东西。微服务有一个开发框架,做业务的同学根本不需要关心容灾,也不需要重复做这样一套东西,这个东西怎么部署,他们也不用关心;立规范。规范怎么做?部署 RPC,一个服务调另外一个服务是怎么做的?创新我觉得没有问题,但你得考虑给其他人带来成本,这个规范还是需要有的,这样可以做全局控制。服务化的稳定和统一,你要考虑它带来真正的优势,性能高是一个点,但是本地优先会好一些;一切都是服务,第四点是和其他公司或团队稍不一样的地方,我们的想法是一切都是服务,每个节点都是抽象归属于某一个具体的服务。存储的确是一个服务,但它不只是提供 API 或者提供功能的东西,还需要包括服务质量,需要别人用起来是比较简单的;启动的时候,服务方式不用去管,就用同一个框架,一个新的规范,容易把已有的服务迁移上来,但这不是个特别强的规范,考虑迁移成本。轻规范,易迁移。服务中心有服务信息,会同时带上是什么样的服务,其他人比较简单的调这个服务就 OK 了。这个服务到底提供什么样的服务质量,拥有者可以管理这个信息。Redis去服务,负载均衡,服务一个项目,把服务接上去。服务之间有个关键的概念:服务授权。一般我们起一个服务,通过 IP 就可以连上它了。数据库有用户名认证,也可以对 IP 授权。不过内网很多服务限制比较少,不是所有服务都有授权认证。我们希望把服务之间的关联关系,全局拓扑关系记录下来并且可执行。描述信息:这个服务是什么样子?最大的 QPS 是多少?通过描述信息发现问题,用户信息服务托不住了,就拒了,把资源分到其它服务上面,就可以做更多的东西。还有机房信息可以放在这里面。比如可观测性是说所有的服务都能暴露内部的状态,这有非常好的优势,服务上来以后,默认剖析内部的端口或者服务端口,服务上线与平台。根据拓扑关系自动分析出来服务状态,甚至做性能剖析,开发者可以不用关心这些事情,天然获得这些能力。前面服务是自治的体现,跟 Docker 比较像,我们也会做容器化的开发。只是把服务跑在容器内还远远不够,把服务化体系打通,我们思路实现开放,实现我们有态度的私有云,把基础设施这一块让我们平台做,业务部门只关心业务。IaaS 管理所有的机器,把公有云整合起来,头条有一些热点事件会全国推广推送,对网络带宽比较高,我们借助公有云,需要哪一种类型计算资源,统一抽象起来。基础设施结合服务化的思路,比如日志,监控等等功能,业务不需要关注细节就可以享受到基础设施提供的能力。夏绪宏:我在过去建一个数据库,直接跑起来。以前把整个库升级,现在只需要升级一小部分,业务比较简单规模比较小的时候单体服务确实成本低。当你的业务增大机器增多,单体服务会成为瓶颈,但是微服务如果是标准化的,可以用自动化的工具、平台去管理,不能靠人去管理,因此成本反而是降低的。Q:选型的时候为什么不用开源,我们是整个平台的架构准备做微服务的改造,想选一下服务的架构,您这块是自己做的,我们在开源和自己做之间在选。能举一个例子?夏绪宏:看场景,你们现在什么都没有可以考虑各种开源方案,我们也有一些自己特殊场景,开源的东西跟内部服务做整合,需要考虑一些整合成本和我们自己维护的成本。很多时候开源项目会出于普适性,会考虑的特性比较多一些,代码也会相对复杂,有些功能我们用不到,我们要去做改造,整体上不复杂;夏绪宏:我们改造到现在也没改造完,这个改造挺困难的。你先定好一个大方向,因为很多东西是涉及到沟通的问题,推动的问题,你先需要沟通好的方向,达成一致,到怎么改造,机动性少一点,或者你把大部分的功能实现好,只需要做小小的迁移,减少迁移的成本。



地址:电话:传真:

版权所有: 如果喜欢新闻门户,请告诉您的朋友 Power by DedeCms技术支持:织梦模板ICP备案编号: