位置共享位置结束对方还能看到吧结束,过了几天导航时对方知不知道呢

卫向军毕业后在微软工作五年,接着去了金山云做的金山快盘,然后去了新浪微博做平台架构师现在在三好网,做在线教育的创业公司

地点:梦想加联合办公空間

大家下午好。感谢大家支持今天的沙龙也感谢梦想加给我们提供场地。麦思博是一家软件研发培训公司2007年成立,我们一直专注于软件研发快速成长今天Into100沙龙是第14期了,我们每次主题都偏向技术每次分享是由三个嘉宾分享。这个模式实际上跟全球软件案例峰会是一致的用50分钟时间给你解读长尾价值。今天第14期主题是千万级规模高性能高并发的网络架构。这次请了了三位技术大咖第一位分享嘉賓来自前新浪微博架构师,现任三好网CTO他为我们分享亿级用户下的高并发的网络架构。

大家下午好我中午从公司过来的时候,外面一矗在下雪在这儿看到是一个又温馨又特别的会场。大家离我的距离非常近所以很感谢麦思博给我这个机会与大家分享探讨。

我是卫向軍毕业后在微软工作五年,接着去了金山云做的金山快盘,然后去了新浪微博做平台架构师现在在三好网,做在线教育的创业公司

第一:我会介绍一下架构以及我理解中架构的本质

第二:介绍一下新浪微博整体架构是什么样的

第三:在 大型网站的系统架构是如何演變的

第四:微博的技术挑 战和正交分解法解析架构

第五:微博多级双机房缓存架 构

第六:分布式服务追踪系统

第七:今天分享的内容 做一丅总结

在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上要重视它战术上又要藐视它。

先举个例子感受一下千万级到底是什么数量级现在很流行的优步(Uber),从媒体公布的信息看它每天接单量平均在百万左右,假如每天有10个小时的服务时间平均QPS只有30左右。对于一个后台服务器单机的平均QPS可以到达800-1000,单独看写嘚业务量很简单为什么我们又不能说轻视它?第一我们看它的数据存储,每天一百万的话一年数据量的规模是多少?其次刚才说嘚订单量,每一个订单要**给附近的司机、司机要并发抢单后面业务场景的访问量往往是前者的上百倍,轻松就超过上亿级别了

今天我想从架构的本质谈起之后,希望大家理解在做一些建构设计的时候它的出发点以及它解决的问题是什么。

架构刚开始的解释是我从知乎上看到的。什么是架构有人讲,说架构并不是一个很悬乎的东西实际上就是一个架子,放一些业务和算法跟我们的生活中的晾衣架很像。更抽象一点说架构其实是对我们重复性业务的抽象和我们未来业务拓展的前瞻,强调过去的经验和你对整个行业的预见

我们偠想做一个架构的话需要哪些能力?我觉得最重要的是架构师一个最重要的能力就是你要有战略分解能力 这个怎么来看呢?第一你必須要有抽象的能力。抽象的能力最基本就是去重去重在整个架构中体现在方方面面,从定义一个函数到定义一个类,到提供的一个服務以及模板,背后都是要去重提高可复用率第二,分类能力 做软件需要做对象的解耦,要定义对象的属性和方法做分布式系统的時候要做服务的拆分和模块化,要定义服务 的接口和规范 第三,算法(性能)它的价值体现在提升系统的性能,所有性能的提升最终都會落到CPU、内 存、IO和网络这4大块上。

这一页PPT举了一些例子来更深入的理解常见技术背后的架构理念:

第一个例子在分布式系统我们会做MySQL分庫分表,我们要从不同的库和表中读取数据这样的抽象最直观就是使用模板,因为绝大多数SQL语义是相同的除了路由到哪个库哪个表,洳果不使用Proxy中间件模板就是性价比最高的方法。

第二个例子看一下加速网络的CDN,它是做速度方面的性能提升刚才我们也提到从CPU、内存、IO、 网络四个方面来考虑,CDN本质上一个是做网络智能调度优 化另一个是多级缓存优化。

第三个例子看一下服务化,刚才已经提到了各个大网站转型过程中一定会做服务化,其 实它就是做抽象和做服务的拆分

第四个例子,看一下消息队列本质上还是做分类,只不過不是两个边际清晰的类而是把两个边际不清晰的子系统通过队列解构并且异步化。

接下我们看一下微博整体架构到一定量级的系统整个架构都会变成三层,客户端包括WEB、安卓和IOS这里就不说了。接着还都会有一个接口层有三个主要作用:

第一个作用:要做安全隔离,因为前端节点都是直接和用户交互需要防范各种恶意攻击;

第二个作用:还充当着一个流量控制的作用,大家知道在2014年春节的时候微信红包每分钟8亿多次的请求,其实真正到它后台的请求量 只有十万左右的数量级(这里的数据可能不准),剩余的流量在接口层就被挡住了;

苐三个作用:我们对PC端和移动端的需求不一样的所以我们可以进行拆分。接口层之后是后台可以看到微博后台有三大块:一个是平台垺务,第二是搜索第三是大数据。到了后台的各种服务其实都是处理的数据 像平台的业务部门,做的就是数据存储和读取对搜索来說做的是数据的检索,对大数据来说是做的数据的挖掘

微博其实和淘宝是很类似的。一般来说第一代架构基本上能支撑到用户到百万級别。第二代架构基本能支撑到千万级别当业务规模到亿级别时,需要第三代的架构

从LAMP的架构到面向服务的架构,有几个地方是非 常難的首先不可能在第一代基础上通过简单的修修补补满足用户量快速增长的,同时线上业务又不能停 这是我们常说的在飞机上换引擎嘚问题。前两天我有一个朋友问我说他在内部推行服务化的时候,把一个模块服务化做完了其他部门就是不接。我建议在做服务化的時候首先更多是偏向业务的梳理,同时要找准一个很好的切入点 既有架构和服务化上的提升,业务方也要有收益比如提 升性能或者降低维护成本同时升级过程要平滑,建议开始 从原子化服务切入比如基础的用户服务, 基础的短消息服务基础的**服务。 第二就是可鉯做无状态服务, 后面会详细讲还有数据量大了后需要做数据Sharding, 后面会将第三代架构要解决的问题,就是用户量和业务 趋于稳步增加(楿对爆发期的指数级增长)更多考虑技术框架的稳定性, 提升系统整体的性能降低成本,还有对整个系统监控的完善和升级

我们通过通过数据看一下它的挑战,PV是在10亿级别 QPS在百万,数据量在千亿级别我们可用性,就是SLA要求4个9接口响应最多不能超过150毫秒,线上所有嘚故障必须得在5分钟内解决完如果说5分钟没处理呢?那会影 响你年终的绩效考核。2015年微博DAU已经过亿我们系统有上百个微服务,每周会有兩次的常规上线和不限次数的紧急上线我们的挑战都一样,就是数据量bigger and bigger,用户体验是faster and faster业务是more and more。互联网业务更多是产品体验驱动技術在产品体验 上最有效的贡献,就是你的性能越来越好每次降低加载一个页面的时间,都可以间接的降低这个页面上用户的流失率

下媔看一下第三代的架构图以及我们怎么用正交分 解法阐述。 我们可以看到我们从两个维度横轴和纵轴可 以看到。一个维度是水平的分层拆分第二从垂直的维 度会做拆分。水平的维度从接口层、到服务层到数据存储 层垂直怎么拆分,会用业务架构、技术架构、监控平台、 服务治理等等来处理我相信到第二代的时候很多架构已 经有了业务架构和技术架构的拆分。我们看一下接口层 有feed、用户关系、通讯接口;服务层,SOA里有基层服务、 原子服务和组合服务在微博我们只有原子服务和组合服 务。原子服务不依赖于任何其他服务组合服务甴几个原 子服务和自己的业务逻辑构建而成 ,资源层负责海量数据 的存储(后面例子会详细讲)

技术框架解决独立于业务的海量高并发场景丅的技 术难题,由众多的技术组件共同构建而成在接口层, 微博使用JERSY框架帮助你做参数的解析,参数的验证 序列化和反序列化;资源层,主要是缓存、DB相关的各类 组件比如Cache组件和对象库组件。

监控平台和服务治理完成系统服务的像素级监控, 对分布式系统做提前診断、预警以及治理包含了SLA 规则的制定、服务监控、服务调用链监控、流量监控、错 误异常监控、线上灰度发布上线系统、线上扩容缩嫆调度系统等。

下面我们讲一下常见的设计原则

第一点:是系统架构三个利器:1、我们RPC服务组件(这里不讲了),2、我们消息中间件 消息Φ间件起的作用:可以把两个 模块之间的交互异步化,其次可以把不均匀请求流量输出 为匀速的输出流量所以说消息中间件异步化解耦和鋶量 削峰的利器。3、配置管理它是代码级灰度发布 以及保障系统降级的利器。

第二点:无状态:接口层最重要的就是无状态我们在电商网站购物,在这个过程中很多情况下是有状态的 比如我浏览了哪些商品,为什么大家又常说接口层是无状态的其实我们把状态从接ロ层剥离到了数据层。像用户在电商网站购物选了几件商品,到了哪一步接口无状态后,状态要么放在缓存中要么放在数据库中,其实它并不是没有状态只是在这个过程中我们要把一些有状态的东西抽离出来到了数据层。

第三点:数据层比服务层更需要设计这是┅条非常重要的经验。对于服务层来说可以拿PHP写,明天你可以拿JAVA来写但是如果你的数据结构开始设计不合理, 将来数据结构的改变会婲费你数倍的代价老的数据格式向新的数据格式迁移会让你痛不欲生,既有工作量上的又有数据迁移跨越的时间周期,有一些甚至需偠半年以上

第四点:物理结构与逻辑结构的映射。上一张图看到两个维度切成十二个区间每个区间代表一个技术领域, 这个可以看做峩们的逻辑结构另外,不论后台还是应用 层的开发团队一般都会分几个垂直的业务组加上一个基 础技术架构组,这就是从物理组织架構到逻辑的技术架构 的完美的映射精细化团队分工,有利于提高沟通协作的 效率

第五点:的访问过程,我们这个架构图里没有涉及到嘚举个例子,比如当你在浏览器输入 www.sanhao网址的时候这个请求在接口层之前发生了什么?首先会查看你本机DNS以及DNS服务,查找域名对应的IP地址然后发送HTTP请求过去。这个请求首先会到前端 的VIP地址(公网服务IP地址)VIP之后还要经过负载均 衡器(Nginx服务器),之后才到你的应用接口层在接口 層之前发生了这么多事,可能有用户报一个问题的时候 你通过在接口层查日志根本发现不了问题,原因就是问题 可能发生在到达接口层の前了

第六点:分布式系统的最终瓶颈。前端时间有一个网友跟我讨论的时候说他们的系统遇到了一个瓶颈, 查遍了CPU内存,网络存储,都没有问题我说你再查一遍,因为你不论用上千台服务器还是上万台服务器最终系统出瓶颈的一定会落在某一台机(可能是叶子節点也可能是核心的节点),一定落在 CPU、内存、存储和网络上最后查出来问题出在某服务器的网卡带宽上。

接下来我们看一下微博的Feed多级緩存我们做业务的时候,经常很少做业务分析技术大会上的分享又都偏向技术架构。其实大家更多的日常工作是需要花费更多时间在業务优化上这张图是统计微博的信息流前几页的访 问比例,像前三页占了97%在做缓存设计的时候,我们最 多只存最近的M条数据 这里强調的就是做系统设计要基 于用户的场景,越细致越好举了一个例子,大家都会 用电商电商在双十一会做全国范围内的活动,他们做设 計的时候也会考虑场景的一个就是购物车,我曾经跟相 关开发讨论过购物车是在双十一之前用户的访问量非常 大,就是不停地往里加商品在真正到双十一那天他不会 往购物车加东西了,但是他会频繁的浏览购物车针对这 个场景,活动之前重点设计优化购物车的写场景 活动开 始后优化购物车的读场景。

你看到的微博是由哪些部分聚合而成的呢?最右边的是Feed就是微博所有关注的人,他们的微博所组成嘚 微博我们会按照时间顺序把所有关注人的顺序做一个排序。 随着业务的发展除了跟时间序相关的微博还有非时间序的微博,就是会囿广告的要求增加一些广告,还有粉丝 头条就是拿钱买的,热门微博都会插在其中。分发控制就是说和一些推荐相关的,我推荐┅些相关的好友的微博我推荐一些你可能没有读过的微博,我推荐一些其他类型的微博 当然对非时序的微博和分发控制微博,实 际会起多个并行的程序来读取最后同步做统一的聚合。

这里稍微分享一下 从SNS社交领域来看,国内现在做的比较好的三个信息流:

  1. 微博是基于弱关系的媒体信息流;
  2. 朋友圈是基于强关系的信息流;
  3. 另外一个 做的比较好的就是今日头条它并不是基于关系来构 建信息流,而是基于兴趣囷相关性的个性化推荐信息流

信息流的聚合,体现在很多很多的产品之中除了SNS, 电商里也有信息流的聚合的影子比如搜索一个商品後出来的列表页,它的信息流基本由几部分组成:第一打广 告的;第二个,做一些推荐热门的商品,其次才是关键字相关的搜索结果。信息流开始的时候很简单但是到后期会发现,你的这个流如何做控制分发非常复杂, 微博在最近一两年一直在做这样的工作

刚才我們是从业务上分析,那么技术上怎么解决高并发高性能的问题?微博访问量很大的时候,底层存储是 用MySQL数据库当然也会有其他的。对于查询请求量大的时候大家知道一定有缓存,可以复用可重用的计算结果 可以看到,发一条微博我有很多粉丝,他们都会来看我

发的內容所以微博是最适合使用缓存的系统,微博的读写比例基本在几十比一

微博使用了双层缓存,上面是L1每个L1上都是一组 (包含4-6台机器),左边的框相当于一个机房右边又是一个机房。在这个系统中L1缓存所起的作用是什么?首先 L1缓存增加整个系统的QPS,其次以低成本灵活扩嫆的方式增加系统的带宽想象一个极端场景,只有一篇博文 但是它的访问量无限增长,其实我们不需要影响L2缓存 因为它的内容存储嘚量小,但它就是访问量大这种场景下,你就需要使用L1来扩容提升QPS和带宽瓶颈另外一个场景,就是L2级缓存发生作用比如我有一千万個用户, 去访问的是一百万个用户的微博 这个时候,他不只是说 你的吞吐量和访问带宽就是你要缓存的博文的内容也很 多了,这个时候你要考虑缓存的容量第二级缓存更多的是从容量上来规划,保证请求以较小的比例穿透到后端的数据库中根据你的用户模型你可以估出来,到底有百分之多少的请求不能穿透到DB 评估这个容量之后,才能更好的评估DB需要多少库需要承担多大的访问的压力。

另外我們看双机房的话,左边一个右边一个。两个机房是互为主备或者互为热备 。如果两个用户在不 同地域他们访问两个不同机房的时候,假设用户从IDC1过来因为就近原理,他会访问L1没有的话才会跑到 Master,当在IDC1没找到的时候才会跑到IDC2来找同时 有用户从IDC2访问,也会有请求从L1囷Master返回或者到 IDC1去查找 IDC1和IDC2,两个机房都有全量的用户 数据同时在线提供服务,但是缓存查询又遵循最近 访问原理

还有哪些多级缓存的唎子呢?CDN是典型的多级缓存。 CDN在国内各个地区做了很多节点比如在杭州市部署一个节点时,在机房里肯定不止一台机器那么对于一个地區 来说,只有几台服务器到源站回源其他节点都到这几台服务器回源即可,这么看CDN至少也有两级

Local Cache+分布式缓存,这也是常见的一种策略 有一种场景,分布式缓存并不适用比如单点资源的爆发 性峰值流量,这个时候使用Local Cache + 分布式缓存 Local Cache在应用服务器上用很小的内存资源挡住少量的极端峰值流量,长尾的流量仍然访问分布式缓存这样的Hybrid缓存架构通过复用众多的应用服务器节点,降低 了系统的整体成本

我們来看一下Feed的存储架构,微博的博文主要存在 MySQL中首先来看内容表,这个比较简单每条内容一个索引,每天建一张表其次看索引表,┅共建了两级索引 首先想象一下用户场景,大部分用户刷微博的时候看的 是他关注所有人的微博,然后按时间来排序仔细分析发 现茬这个场景下, 跟一个用户的自己的相关性很小了 所以在一级索引的时候会先根据关注的用户,取他们的前条微博ID然后聚合排序。我們在做哈希(分库分表)的 时候同时考虑了按照UID哈希和按照时间维度。很业务和时间相关性很高的今天的热点新闻,明天就没热度了 数據的冷热非常明显,这种场景就需要按照时间维度做分表首先冷热数据做了分离(可以对冷热数据采用不同的 存储方案来降低成本),其次 很容止控制我数据库表的爆炸。像微博如果只按照用户维度区分那么这个用户所有数据都在一张表里,这张表就是无限增长的时间長了 查询会越来越慢。二级索引是我们里面一个比较特殊的场景,就是我要快速找到这个人所要发布的某一时段的微博时通过二级索引快速定位。

分布式追踪服务系统当系统到千万级以后的时候, 越来越庞杂所解决的问题更偏向稳定性,性能和监控 刚才说用户只偠有一个请求过来,你可以依赖你的服务 RPC1、RPC2你会发现RPC2又依赖RPC3、RPC4。分布式服 务的时候一个痛点就是说一个请求从用户过来之后,在 后台鈈同的机器之间不停的调用并返回

当你发现一个问题的时候,这些日志落在不同的机器 上你也不知道问题到底出在哪儿,各个服务之間互相隔 离互相之间没有建立关联。所以导致排查问题基本没有 任何手段就是出了问题没法儿解决。

我们要解决的问题我们刚才说ㄖ志互相隔离,我们 就要把它建立联系建立联系我们就有一个请求ID,然后结合RPC框架 服务治理功能。假设请求从客户端过来 其中包含┅个ID 101,到服务A时仍然带有ID 101然后调 用RPC1的时候也会标识这是101 ,所以需要一个唯一的请求ID标识递归迭代的传递到每一个相关节点第二个, 你莋的时候你不能说每个地方都加,对业务系统来说需 要一个框架来完成这个工作这个框架要对业务系统是最低侵入原则,用JAVA的话就可鉯用AOP要做到零侵入的原则,就是对所有相关的中间件打点从接口层组件 (HTTP Client、HTTP Server)至到服务层组件(RPC Client、RPC Server),还有数据访问中间件的这样业 务系统呮需要少量的配置信息就可以实现全链路监控 。为什么要用日志?服务化以后每个服务可以用不同的开发 语言,考虑多种开发语言的兼容性内部定义标准化的日志是唯一且有效的办法。

最后如何构建基于GPS导航的路况监控?我们刚才讲分布式服务追踪。分布式服务追踪能解決的问题如果单一用户发现问题后,可以通过请求ID快速找到发生问 题的节点在什么但是并没有解决如何发现问题。我们看 现实中比较嫆易理解的道路监控每辆车有GPS定位,我想 看北京哪儿拥堵的时候怎么做? 第一个,你肯定要知 道每个车在什么位置它走到哪儿了。其實可以说每个车 上只要有一个标识加上每一次流动的信息,就可以看到 每个车流的位置和方向其次如何做监控和报警,我们怎 么能了解道路的流量状况和负载并及时报警。我们要定 义这条街道多宽多高单位时间可以通行多少辆车,这就 是道路的容量有了道路容量,再有道路的实时流量我 们就可以基于实**路况做预警?

对应于分布式系统的话如何构建? 第一,你要定 义每个服务节点它的SLA是多少?SLA可以从系統的CPU占 用率、内存占用率、磁盘占用率、QPS请求数等来定义相 当于定义系统的容量。 第二个统计线上动态的流量, 你要知道服务的平均QPS、最低QPS和最大QPS有了流量和 容量,就可以对系统做全面的监控和报警

刚才讲的是理论,实际情况肯定比这个复杂微博在 春节的时候做許多活动,必须保障系统稳定理论上你只要定义容量和流量就可以。但实际远远不行为什么?有 技术的因素,有人为的因素因为不同嘚开发定义的流量 和容量指标有主观性,很难全局量化标准所以真正流量 来了以后,你预先评估的系统瓶颈往往不正确实际中我 们在春节前主要采取了三个措施:

第一,最简单的就是有 降级的预案流量超过系统容量后,先把哪些功能砍掉 需要有明确的优先级 。

第二线上全链路压测,就是把 现在的流量放大到我们平常流量的五倍甚至十倍(比如下 线一半的服务器缩容而不是扩容),看看系统瓶颈最先 發生在哪里我们之前有一些例子,推测系统数据库会先 出现瓶颈但是实测发现是前端的程序先遇到瓶颈。

第三 搭建在线Docker集群, 所有業务共享位置结束对方还能看到吧备用的Docker 集群资源这样可以极大的避免每个业务都预留资源,但 是实际上流量没有增长造成的浪费

接丅来说的是如何不停的学**和提升,这里以Java语 言为例首先,一定要理解JAVA;第二步JAVA完了以后, 一定要理解JVM;其次还要理解操作系统;再次還是要 了解一下Design Pattern,这将告诉你怎么把过去的经 验抽象沉淀供将来借鉴;还要学**TCP/IP、分布式系统、 数据结构和算法

最后就是我想说的就是今天峩所说的可能一切都是错的! 大家通过不停的学**、练**和总结, 形成自己的一套架构 设计原则和方法谢谢大家。

}

我要回帖

更多关于 共享位置结束对方还能看到吧 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信