Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >好架构是进化来的,不是设计来的(58架构演进)

好架构是进化来的,不是设计来的(58架构演进)

作者头像
架构师之路
发布于 2018-03-01 03:01:12
发布于 2018-03-01 03:01:12
1.3K0
举报
文章被收录于专栏:架构师之路架构师之路

好的架构化是进化而来的,不是设计出来的

----58沈剑

核心内容:58同城流量从小到大过程中,架构是如何演进的?遇到了哪些问题?以及如何解决这些问题?

核心观点:好的架构不是设计出来的,而是进化而来的。

如何演进:站点流量在不同阶段,会遇到不同的问题,找到对应阶段站点架构所面临的主要问题,在不断解决这些问题的过程中,整个系统的架构就不断的演进了。

如何演进,简言之:找到主要矛盾,并解决主要矛盾。


第一章:建站之初

建站之初,站点流量非常小,可能低于十万级别。这意味着,平均每秒钟也就几次访问。请求量比较低,数据量比较小,代码量也比较小,几个工程师,很短的时间搭起这样的系统,甚至没有考虑“架构”的问题。

和许多创业公司初期一样,最初58同城的站点架构特点是“ALL-IN-ONE”:

这是一个单机系统,所有的站点、数据库、文件都部署在一台服务器上。工程师每天的核心工作是CURD,浏览器端传过来一些数据,解析GET/POST/COOKIE中传过来的数据,拼装成一些CURD的sql语句访问数据库,数据库返回数据,拼装成页面,返回浏览器。相信很多创业团队的工程师,初期做的也是类似的工作。

58同城最初选择的是微软技术体系这条路:Windows、iis、SQL-Sever、C#

如果重新再来,我们可能会选择LAMP体系。

为什么选择LAMP?

LAMP无须编译,发布快速,功能强大,社区活跃,从前端+后端+数据库访问+业务逻辑处理全部可以搞定,并且开源免费,公司做大了也不会有人上门收钱(不少公司吃过亏)。现在大家如果再创业,强烈建议使用LAMP。

初创阶段,工程师面临的主要问题:写CURD的sql语句很容易出错。

我们在这个阶段引进DAO和ORM让工程师们不再直接面对CURD的sql语句,而是面对他们比较擅长的面向对象开发,极大的提高了编码效率,降低了出错率。


第二章:流量增加,数据库成为瓶颈

随着流量越来越大,老板不只要求“有一个可以看见的站点”,他希望网站能够正常访问,当然速度快点就更好了。

而此时系统面临问题是:流量的高峰期容易宕机,大量的请求会压到数据库上,数据库成为新的瓶颈,人多并行访问时站点非常卡。这时,我们的机器数量也从一台变成了多台,我们的系统成了所谓的(伪)“分布式架构”:

我们使用了一些常见优化手段:

(1)动静分离,动态的页面通过Web-Server访问,静态的文件例如图片就放到单独的文件服务器上;

(2)读写分离,将落到数据库上的读写请求分派到不同的数据库服务器上;

互联网绝大部分的业务场景,都是读多写少。对58同城来说,绝大部分用户的需求是访问信息,搜索信息,只有少数的用户发贴。此时读取性能容易成为瓶颈,那么如何扩展整个站点架构的读性能呢?常用的方法是主从同步,增加从库。我们原来只有一个读数据库,现在有多个读数据库,就提高了读性能。

在这个阶段,系统的主要矛盾为“站点耦合+读写延时”,58同城是如何解决这两个问题的呢?

第一个问题是站点耦合。对58同城而言,典型业务场景是:类别聚合的主页,发布信息的发布页,信息聚合的列表页,帖子内容的详细页,原来这些系统都耦合在一个站点中,出现问题的时候,整个系统都会受到影响。

第二个问题是读写延时。数据库做了主从同步和读写分离之后,读写库之间数据的同步有一个延时,数据库数据量越大,从库越多时,延时越明显。对应到业务,有用户发帖子,马上去搜索可能搜索不到(着急的用户会再次发布相同的帖子)。

要解决耦合的问题,最先想到的是针对核心业务做切分,工程师根据业务切分对系统也进行切分:我们将业务垂直拆分成了首页、发布页、列表页和详情页

另外,我们在数据库层面也进行了垂直拆分,将单库数据量降下来,让读写延时得到缓解。

同时,还使用了这些技术来优化系统和提高研发效率:

(1)对动态资源和静态资源进行拆分。对静态资源我们使用了CDN服务,用户就近访问,静态资源的访问速度得到很明显的提升;

(2)除此之外,我们还使用了MVC模式,擅长前端的工程师去做展示层,擅长业务逻辑的工程师就做控制层,擅长数据的工程师就做数据层,专人专用,研发效率和质量又进一步提高。


第三章:全面转型开源技术体系

流量越来越大,当流量达到百万甚至千万时,站点面临一个很大的问题就是性能和成本的折衷。上文提到58同城最初的技术选型是Windows,我们在这个阶段做了一次脱胎换骨的技术转型,全面转向开源技术:

(1)操作系统转型Linux

(2)数据库转型Mysql

(3)web服务器转型Tomcat

(4)开发语言转向了Java

其实,很多互联网公司在流量从小到大的过程中都经历过类似的转型,例如京东和淘宝。

随着用户量的增加,对站点可用性要求也越来越高,机器数也从最开始的几台上升到几百台。那么如何提供保证整个系统的可用性呢?首先,我们在业务层做了进一步的垂直拆分,同时引入了Cache,如下图所示:

在架构上,我们抽象了一个相对独立的服务层,所有数据的访问都通过这个服务层统一来管理,上游业务线就像调用本地函数一样,通过RPC的框架来调用这个服务获取数据,服务层对上游屏蔽底层数据库与缓存的复杂性。

除此之外,为了保证站点的高可用,我们使用了反向代理。

什么是代理?代理就是代表用户访问xxoo站点。

什么是反向代理?反向代理代表的是58网站,用户不用关注访问是58同城的哪台服务器,由反向代理来代表58同城。58同城通过反向代理,DNS轮询, LVS等技术,来保证接入层的高可用性。

另外,为了保证服务层和数据层的高可用,我们采用了冗余的方法,单点服务不可用,我们就冗余服务,单点数据不可用,我们就冗余数据。

这个阶段58同城进入了一个业务高速爆发期,短期内衍生出非常多的业务站点和服务。新增站点、新增服务每次都会做一些重复的事情,例如线程模型,消息队列,参数解析等等,于是,58同城就研发了自己的站点框架和服务框架,现在这两个框架也都已经开源:

(1)站点框架Argo:https://github.com/58code/Argo

(2)服务框架Gaea:https://github.com/58code/Gaea

这个阶段,为了进一步解耦系统,我们引入了配置中心、柔性服务和消息总线。

引入配置中心,业务要访问任何一个服务,不需要在本地的配置文件中配置服务的ip list,而只需要访问配置中心。这种方式的扩展性非常好,如果有机器要下线,配置中心会反向通知上游订阅方,而不需要更新本地配置文件。

柔性服务是指当流量增加的时候,自动的扩展服务和站点。

消息总线也是一种解耦上下游“调用”关系常见的技术手段。

机器越来越多,此时很多系统层面的问题,靠“人肉”已经很难搞定,于是自动化变得越来越重要:自动化回归、自动化测试、自动化运维、自动化监控等等等等。

最后补充一点,这个阶段我们引入了不少智能化产品,比如智能推荐,主动推荐一些相关的数据,以增加58同城的PV;智能广告,通过一些智能的策略,让用户对广告的点击更多,增加同城的收入;智能搜索,在搜索的过程中加入一些智能的策略,提高用户的点击率,以增加58同城的PV。这些智能化产品的背后都由技术驱动。


第四章、进一步的挑战

现在,58同城的流量已经达到10亿的量级,架构上我们规划做一些什么样的事情呢,几个方向:

(1)业务服务化

(2)多架构模式

(3)平台化

(4)...


第五章:小结

最后做一个简单的总结,网站在不同的阶段遇到的问题不一样,而解决这些问题使用的技术也不一样:

(1)流量小的时候,我们要提高开发效率,可以在早期要引入ORM,DAO;

(2)流量变大,可以使用动静分离、读写分离、主从同步、垂直拆分、CDN、MVC等方式不断提升网站的性能和研发效率;

(3)面对更大的流量时,通过垂直拆分、服务化、反向代理、开发框架(站点/服务)等等手段,可以不断提升高可用(研发效率);

(4)在面对上亿级的流量时,通过配置中心、柔性服务、消息总线、自动化(回归,测试,运维,监控)来迎接新的挑战;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
58同城沈剑:好的架构源于不停地衍变,而非设计
对很多创业公司而言,随着业务增长,网站的流量也会经历不同的阶段。从十万流量到一百万流量,再从一百万流量跨越到一千万甚至上亿的流量,网站的架构需要经历哪些变化?在“OneAPM 技术公开课”第一期中,58同城的技术委员会执行主席沈剑对此进行了详细剖析。 以下为演讲整理 本次演讲主要会阐述,58同城从小流量、中等规模流量、大流量,到更大的流量过程中,架构是如何演进的?遇到了哪些问题?以及如何解决这些问题? 好的架构不是设计出来的,而是演进出来的 对很多创业公司而言,很难在初期就预估到流量十倍、百倍以及千倍以后网
CSDN技术头条
2018/02/11
2K0
58同城沈剑:好的架构源于不停地衍变,而非设计
58同城推荐系统架构设计与实现
主题 58同城推荐系统架构设计与实现 一、推荐系统架构介绍 推荐系统是一个微庞大的工程、算法与业务综合的系统,其主要分为三大子系统: 1)线下推荐子系统; 2)线上推荐子系统; 3)效果评估子系统;
架构师之路
2018/03/01
1.9K0
58同城推荐系统架构设计与实现
100亿数据1万属性数据架构设计
一分钟系列之《啥,又要为表增加一列属性?》分享了两种数据库属性扩展思路,被喷得厉害。第二天补充了一篇《这才是真正的表扩展方案》,分享了互联网大数据高并发情况下,数据库属性扩容的成熟工具及思路。 对于version + ext方案,还是有很多朋友质疑“线上不可能这么用”。本篇将讲述一下58同城最核心的数据“帖子”的架构实现技术细节,说明不仅不是“不可能这么用”,而是大数据,可变属性,高吞吐场景下的“常用手段”。 一、背景描述及业务介绍 问:什么是数据库扩展的version + ext方案? 使用ext来承载不
架构师之路
2018/03/01
2.1K0
100亿数据1万属性数据架构设计
【SDCC讲师专访】58同城孙玄:一切抛开业务的架构设计都是耍流氓
本期我们采访的讲师是来自58同城高级系统架构师&技术负责人孙玄,他是58的技术委员会架构组主任,产品技术学院优秀讲师,代表58同城参与多次对外演讲。 58同城高级系统架构师,技术委员会架构组主任,产品技术学院优秀讲师,58同城即时通讯、C2C技术负责人,擅长架构设计,负责58核心系统的架构以及优化工作,满足百亿级系统吞吐需求。分布式系统存储专家,2007年开始从事大规模高性能分布式存储系统架构设计实现工作。 涉及自主研发分布式存储系统、MongoDB、MySQL、Memcached、Redis等。毕业于浙江
玄姐谈AGI
2018/07/03
9970
58同城数据库架构设计思路(下)
《58同城数据库架构设计思路》(下) WOT(World Of Tech)2015,互联网运维与开发者大会将在北京举行,会上58同城分享了《大数据量下,58同城mysql实战(上)》的主题 DTCC(Database Tech Conference China)2015,中国数据库技术大会举办在即,会上58同城将分享《数据库架构师做什么?58同城数据库架构设计思路(下)》,大会内容抢先看,一起来看看58同城怎么玩数据库架构设计的。 58同城数据库架构设计思路 (1)可用性设计 解决思路:复制+冗余 副作用
架构师之路
2018/03/01
1.3K0
58同城数据库架构设计思路(下)
58同城推荐系统架构设计与实现-top100summit(纯干货)
2014年11月21日,58同城将在top100summit峰会的“架构设计专场”分享“58同城推荐系统架构设计与实现”,本文是对分享主题的一个“简要”的介绍。 主题 58同城推荐系统架构设计与实现
架构师之路
2018/02/28
1.6K0
58同城推荐系统架构设计与实现-top100summit(纯干货)
从100到1000万高并发的架构演进之路
本文以设计淘宝网的后台架构为例,介绍从一百个并发到千万级并发情况下服务端的架构的14次演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知。文章最后汇总了一些架构设计的原则。
bigsai
2019/09/24
3.9K0
从100到1000万高并发的架构演进之路
从 0 到 1,Java Web 网站架构搭建的技术演进
Linuxer
2017/11/01
3.1K0
从 0 到 1,Java Web 网站架构搭建的技术演进
多机房多活架构,究竟怎么玩?
《当年,我们是怎么平滑上云的?》一文中提到了上云的背景,将所有的系统,从一个机房,迁移到另一个机房。
架构师之路
2020/03/23
1.4K0
多机房多活架构,究竟怎么玩?
揭秘大型网站架构进化之路
丁浪,非著名架构师。关注高并发、高可用的架构设计,对系统服务化、分库分表、性能调优等方面有深入研究和丰富实践经验。热衷于技术研究和分享。 声明:版权归丁浪作者本人所有,转载请联系作者本人。 互联网上有很多关于网站架构的各种分享,有些主要是从运维和基础架构的角度去分析的(堆机器,做集群),太关注技术细节实现,普通的开发人员基本看不太懂。 本文第一章节将主要介绍大型网站基础架构的扩展,第二章节则重点从应用程序的角度去介绍网站架构的扩展和演变。 一,大型网站基础架构的扩展 草根时期,快速开发网站并上线。当然,通
架构师小秘圈
2018/04/02
1.2K0
揭秘大型网站架构进化之路
58同城mysql实战(纯干货)
《大数据量下,58同城mysql实践》 WOT(World Of Tech)2015,互联网运维与开发者大会将在北京举行,会上58同城将分享《大数据量下,58同城mysql实战》的主题,干货分享抢先看
架构师之路
2018/02/28
2K0
58同城mysql实战(纯干货)
58同城数据库架构设计思路
(1)可用性设计 解决思路:复制+冗余 副作用:复制+冗余一定会引发一致性问题 保证“读”高可用的方法:复制从库,冗余数据,如下图 带来的问题:主从不一致 解决方案:见下文 保证“写”高可用的一般方法
用户1263954
2018/01/30
2.4K0
58同城数据库架构设计思路
58同城高性能移动Push推送平台架构演进之路
关于作者:孙玄,58赶集集团系统架构师,技术负责人,技术委员会架构组主任,也是58同城即时通讯、C2C技术负责人,负责58核心系统的架构以及优化工作。分布式系统存储专家,前百度高级工程师,参与社区搜索部多个基础系统的设计与实现。
后端技术探索
2018/08/09
2.1K0
数据库软件架构设计些什么
缘起:受@萧田国 萧总邀请,上周五晚上在“高效运维1号群”内分享了《58同城数据库软件架构设计与实践》(这个topic今年在数据库大会上分享过),应组织方要求,发出纪要。 ---- 一、基本概念 二
架构师之路
2018/03/01
9500
数据库软件架构设计些什么
SDCC 2015架构专场札记:一线互联网公司的架构实践
【编者按】11月21日,为期三天的SDCC2015中国软件开发者大会成功闭幕,主办方总计邀请了95余位演讲嘉宾,为参会者奉献了10个主题演讲,9大技术专场论坛(80余场技术演讲),另外还有5场特色活动。另外,据官方统计参会人数高达1067名(不含工作人员)。 其中20日的架构专场,现场听讲人数一度爆满,而没有机会亲临现场的童鞋们,我们特邀请了业内专家、与会者分享他们的听课感受及他们眼中的架构专场。以下是来自搜狗商业平台架构师么刚参加架构专场的听课札记,以飨读者。 以下为么刚的参会笔记: 航天信息股份有限公司
CSDN技术头条
2018/02/11
1.1K0
SDCC 2015架构专场札记:一线互联网公司的架构实践
DNSPod十问58沈剑:为什么创业公司不能做"中台"?
问答时间:2020年9月3日 嘉宾简介: 沈剑:快狗打车CTO,58到家集团技术委员会主席,互联网架构技术专家,技术圈大V号“架构师之路”作者。曾任百度高级工程师,58同城技术委员会主席,高级架构师,技术学院优秀讲师。 主持人简介: 吴洪声(人称:奶罩):腾讯云中小企业产品中心总经理,DNSPod创始人,洋葱令牌创始人,网络安全专家,域名及DNS技术专家,知名个人站长,中欧国际工商学院校友。 以下为对话原文整理: 第一问 吴洪声:关注你的公众号好些年了,今年又关注了你的视频号。无论是文章还是视频号,而
腾讯云DNSPod团队
2020/09/07
2.4K3
架构设计《一》谈谈架构
https://blog.csdn.net/hguisu/article/details/78258430
搜云库技术团队
2019/10/17
2.7K0
从IDC到云端架构迁移之路(GITC2016)
大家好,很高兴来到GITC2016的舞台,我是来自58到家的沈剑,今天我分享的主题是《58到家从IDC到云端架构迁移之路》。 机房迁移是一个很大的动作: 15年在58同城实施过一次(“逐日”项目),几千台物理机,从IDC迁到了腾讯的天津机房,项目做了10个多月,跨所有的部门,与所有的业务都相关; 16年在58到家又实施了一次(“凌云”项目),几百台虚拟机,从IDC迁到阿里云,前后大概一个季度的时间,也是所有技术部门都需要配合的一个大项目。 “单机房架构-全连” 要说机房迁移,先来看看被迁移的系统是一个什么样
架构师之路
2018/03/01
1.6K0
从IDC到云端架构迁移之路(GITC2016)
分布式系统常见问题总结[通俗易懂]
1)im系统,例如qq或者微博,每个人都读自己的数据(好友列表、群列表、个人信息);
全栈程序员站长
2022/08/31
9070
《大型网站技术架构》学习笔记-01概述
李智慧老师的大型网站架构已经买了两年了,之前大体看过一次,不过还未内化为自己的本领,最近项目空闲,决定尽力掌握这部分的知识,以跟上大师的节奏。今天是儿童节,祝自己和大家心态永远年轻,即使没有年轻的身体
用户1216676
2018/01/24
9670
推荐阅读
相关推荐
58同城沈剑:好的架构源于不停地衍变,而非设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档