【编者按】对不少创业公司而言,随着业务增加,网站的流量也会经历不一样的阶段。从十万流量到一百万流量,再从一百万流量跨越到一千万甚至上亿的流量,网站的架构须要经历哪些变化?在“OneAPM 技术公开课”第一期中,58同城的技术委员会执行主席沈剑对此进行了详细剖析。前端
本次演讲主要会阐述,58同城从小流量、中等规模流量、大流量,到更大的流量过程当中,架构是如何演进的?遇到了哪些问题?以及如何解决这些问题?git
对不少创业公司而言,很难在初期就预估到流量十倍、百倍以及千倍之后网站架构会是什么样的一个情况。同时,若是系统初期就设计一个千万级并发的流量架构,很难有公司能够支撑这个成本。github
所以,这里主要会关注架构的眼花。在每一个阶段,找到对应该阶段网站架构所面临的问题,而后在不断解决这些问题,在这个过程当中整个架构会一直演进。数据库
在58同城创建之初,站点的流量很是小,可能也就是十万级别,这也就意味着,平均每秒钟也就是几回的访问,此时网站架构的特色是:请求量比较低,数据量比较小,代码量也比较小。这个时候的站点能够被几个工程师轻易搞定,所以根本没什么“架构”可言。后端
其实这也是不少创业公司初期面临的问题,最开始58同城的站点架构用一个词归纳就是“ALL IN ONE”,以下图所示:浏览器
就像一个单机系统,全部的东西都部署在一台机器上,包括站点、数据库、文件等等。而工程师天天的核心工做就是CURD,前端传过来一些数据,而后业务逻辑层拼装成一些CURD访问数据库,数据库返回数据,数据拼装成页面,最终返回到浏览器。相信不少创业团队初期都面临一个与之相似的状况,天天写代码,写SQL、接口参数、访问数据等等。缓存
这里须要说明一个问题,你们都知道最初58同城使用的是Windows、iis、SQL-Sever、C#这条路。如今不少创业公司可能就不会这么作。服务器
不少创业的同窗可能会想,初期什么样的一个架构合适? 若是重来,站在如今这个角度上58会选择LAMP,为何?首先是无须编译,并且快速发布功能强大,从前端到后端、数据库访问、业务逻辑处理等等所有能够搞定,最重要都是成熟的开源产品,彻底免费的。若是使用LAMP搭建一个论坛,两天的时间就足够了。因此,若是在创业初期,就尽可能不要再使用Windows。架构
在这个阶段58同城面临的主要问题是什么?其实就是招人,最初工程师写CURD都容易出错。当时引进了DAO和ORM,从而避免直接面对CURD语句,而是面对工程师比较擅长的是面向对象,可以极大的提升工做效率,下降出错率。并发
随着58同城的高速增加,系统很快跨越了十万流量阶段。主要需求是什么?网站可以正常访问,固然速度更快点就行了。而此时系统面临的问题有:在流量峰值期容易宕机,由于大量的请求会压到数据库上,因此数据库成为新的瓶颈,从而,人越多访问越慢。而在这个时候,机器数量也从一台变成了多台,因此很天然的行程了分布式架构,以下图所示:
首先,使用了一些很是常见的技术,一方面是动静分离,动态的页面经过Web-Servre访问,静态的像图片等就单独放到了一些服务器上。另一点就是读写分离。其实,对58同城或者说绝大部分的站点而言,通常来讲都是读多写少。对58同城来讲,绝大部分用户是访问信息,只有不多的用户过来发贴。那么如何扩展整个站点架构的读请求呢?经常使用的是主从同步,读写分离。同时原来只有一个数据库,如今使用多个不一样的数据库提供服务,这样的话,就扩展了读写,很快就解决了中等规模下数据访问的问题。
在这个阶段,系统的主要矛盾就是“站点耦合+读写延时”,58同城是如何进行解耦,如何缓解延时呢?
对58同城而言,典型业务场景是主页,发布信息有发布页,信息聚合、标题聚合有列表页,点开一个标题有详细页,而这些站点都是耦合在一个程序中的,或者说耦合在一个站点中的,当一个站点出现问题,整个站点就会由于耦合一块儿出问题。
第二个问题,你们都知道作数据库读请求和写请求,分布在不一样的数据库上,这个时候若是再读取可能读到的是旧数据,由于读写有一个延时。若是有用户发帖子,立刻去找的话确定找不到,极可能带来的后果就是陆续在发布两条信息,这就是一个很大的问题。尤为是在请求量愈来愈大的时候,这个问题就更加突出。
在解决这些问题时,最早想到的是针对原来站点的核心业务作切分,而后工程师根据本身的站点和业务场景进行细分。首先,业务拆分是58同城最早尝试的优化——将业务垂直拆分红了首页和发布页。另外,在数据库层面,随之也进行了拆分,将大数据量拆分红一个个小的数据量。这样,读写延时就立刻获得了缓解。尤为是在代码拆分红了不一样的层面以后,站点耦合也获得了缓解,数据加载速度也提高了不少。
当时,还使用了一些技术,前面也提到了对动态资源和静态资源进行拆分。其中,咱们对静态资源使用了CDN服务,便于数据缓存和就近访问,访问速度获得很明显的提高。除此以外,还使用了MVC模式,擅长前端的去作展现层,擅长协做逻辑的工程师就作Contorller,擅长数据的人就负责数据,效率就会逐步的提升,最后就是负载均衡技术。
流量愈来愈大,当流量超过一千多万时,58同城面临的最大问题就是性能和成本。此前曾提到58同城最初的技术选型是Windows,整个网站的性能变得很是之低。即便进行了业务拆分和一些优化,依然解决不了这个问题,因此当时作了一个很是艰难的决定,就是转型:将整个Windows技术体系转向了Java体系,这涵盖了操做系统、数据库等多个维度。
其实,如今不少大的互联网公司在流量从小到大的过程当中都经历过转型,包括京东、淘宝等等。对技术的要求愈来愈高,任何一个站点都不能挂,对站点的可用性要求也是愈来愈高。
就在这个时候,58同城业务量也出现一个爆发期。因而招聘了不少工程师,你们一块儿写愈来愈多的站点,可是发现效率很低,常常作一些重复性的工做,好比参数解析等等。同时,业务之间相互依赖,不管是分类的子系统仍是信息的子系统,二手车业务、房产业务都要访问用户和信息等一些底层数据,代码之间频繁的沟通,效率也不可能很高。
问题随之而来,站点数愈来愈多,数据量愈来愈大,机器数从最开始的几台上升到几百台的级别。那么如何提供整个架构的可用性呢?首先,在上层进行了一些改进和优化,再作进一步的垂直拆分,同时引入了Cache,以下图所示:
在架构的改进上,这里构建了一个相对独立的服务层,这个服务层作的每一个业务线都会写对应的代码。若是用户发出请求,就由这个服务层统一来管理,全部的上游业务线就像调用本地函数同样,经过IDC的框架来调用这个服务。整个用户登陆先访问Cache,若是Cache变更了就直接返回,若是Cache不变更,就会访问数据库,这样把数据库的数据拿到本地再放回Cache,再打回上一轮。如此一来,业务逻辑所有封装在这个服务的上游管理,该业务逻辑只有服务层可以编写代码,而后由这个服务层集中管理、集中优化,这样就提升了效率。
除此以外,为了保证站点的高可用,主要使用了反向代理技术。由于对用户而言,他主要为了使用58同城的服务,不会关注访问是58同城或者有十台首页的服务器。58同城经过反向代理技术,经过DNS群,经过LVS技术,来保证接入层的高可用性,同时还保证了服务层、站点层、数据层的高可用。另外,为了保证高可用还使用了冗余的方法,不管是站点服务和数据服务均可以使用这种方式进行解决,一个站点不可用,就换一个站点,一个数据库不够用,就多加几个。固然,数据冗余也会带来一些反作用,若是数据量更新的话,那就须要将全部的“冗余”都要进行更新。
58同城也作了一个图片存储系统,开始都是存储在操做系统之上,随着新增站点、新增服务,压力就变得愈来愈大。因而,58同城就自建了站点框架和服务框架,如今这两个框架也已经开源(如何下降站点开发成本?https://github.com/58code/Argo 如何下降服务开发成本? https://github.com/58code/Gaea )只须要修改一些基本的配置就可使用了。
随着用户量、数据量并发量进一步的增加,58同城也拓展了不少的新业务,那么对产品迭代速度要求就很是高,总体的架构对自动化的要求愈来愈高。
为了支撑业务的发展,技术团队对架构作了进一步的解耦,另外就是引入了配置中心,若是要访问任何一个服务,不会直接在本地的配置中留下一个服务,配置中心告诉这个服务的特色,若是扩展的话,配置中心自动下达消息,若是有机器要下线的话,配置中心会反向经过发邮件的方式进行通知。
而柔性服务是指当流量增长的时候,自动的新增服务。能够看到进一步解耦以后,有垂直业务、无线业务、集成业务等等,这些子系统之间都是经过配置中心相应之间发生关系的。
另外一点就是关于数据库,当某一点成为一个业务线重点的时候,就会集中解决这个点的问题。最初期的时候每一个业务线都要访问数据库,访问缓存,访问用户数据,因而把代码集中的放到了服务层。如今数据量愈来愈大,你们都要作数据切分,每一个业务线都作切分,这个时候58同城的每一个页面都面对这样的痛点,因而把这个痛点拿到集中的层面来解决。
最后一点就是效率矛盾,此时有不少问题,靠“人肉”已经很难进行搞定了。这就须要自动化,包括回归、测试、运维、监控等等都要回归到自动化。
这里须要补充一点,就是在产品层面引入了智能化,好比说智能推荐,主动推荐一些相关的话题;智能广告,经过一些智能的策略,让用户对广告的点击更多,增长对58同城的收录;智能搜索,在搜索的过程当中加入一些搜索的策略,能够提升搜索的权重,也能够增长58同城的PV。固然,全部的自动化的产品背后都是由技术在驱动。
如今,58同城的流量已经突破了10亿量级,那么架构上将来面临哪些挑战呢?一方面是无线化、移动化。另外一方面就是需求的变化,必须加快迭代一些东西。若是拥有10亿的流量,却跑在一亿的架构上确定是不行的。将来,还会使用更多的并行计算、实时计算,若是能作到实时推荐,效果确定很是好,这也是挑战之一。最后一点,58同城如今的服务器大概在3000台左右,将来将拓展到10000台,这就是运维的挑战了。
最后作一个小的总结,网站在不一样的阶段遇到的问题不同,而解决这些问题使用的技术也不同,流量小的时候,主要目的是提升开发效率,在早期要引入ORM,DAO这些技术。随着流量变大,使用动静分离、读写分离、主从同步、垂直拆分、CDN、MVC等方式不断地提高网站稳定性。面对更大的流量时,经过垂直拆分、服务化、反向代理、开发框架(站点/服务)等等,不断提高高可用。在面对上亿级的更大流量时,经过中心化、柔性服务、消息总线、自动化(回归,测试,运维,监控)来迎接新的挑战。将来的就是继续实现
移动化,大数据实时计算,平台化……系统架构会一直迭代衍变,就像最初的从零到如今。(整理/OneAPM技术编辑王鹏 责编/仲浩)
http://www.csdn.net/article/2015-10-24/2826028