来自: InfoQ

媒介

新浪微博在2014年3月公布的月生动用户(MAU)已经达到1.43亿,2014年新年第一分钟发送的微博达808298条,如此巨大的用户规模和业务量,须要高可用(HA)、高并发访问、低延时的强大后台系统支撑。

微博平台第一代架构为LAMP架构,数据库利用的是MyIsam,后台用的是php,缓存为Memcache。

php原子亿级用户下的新浪微博平台架构 Ruby

随着运用规模的增长,衍生出的第二代架构对业务功能进行了模块化、做事化和组件化,后台系统从php更换为Java,逐渐形成SOA架构,在很长一段韶光支撑了微博平台的业务发展。

在此根本上又经由永劫光的重构、线上运行、思虑与沉淀,平台形成了第三代架构体系。

我们先看一张微博的核心业务图(如下),是不是非常繁芜?但这已经是一个简化的不能再简化的业务图了,第三代技能体系便是为了保障在微博核心业务上快速、高效、可靠地发布新产品新功能。

第三代技能体系

微博平台的第三代技能体系,利用正交分解法建立模型:在水平方向,采取范例的三级分层模型,即接口层、做事层与资源层;在垂直方向,进一步细分为业务架构、技能架构、监控平台与做事管理平台。
下面是平台的整体架构图:

如上图所示,正交分解法将全体图分解为34=12个区域,每个区域代表一个水平维度与一个垂直维度的交点,相应的定义这个区域的核心功能点,比如区域5紧张完成做事层的技能架构。

下面详细先容水平方向与垂直方向的设计原则,尤其会重点先容4、5、6中的技能组件及其在全体架构体系中的浸染。

水平分层

水平维度的划分,在大中型互联网后台业务系统的设计中非常根本,在平台的每一代技能体系中都有表示。
这里还是大略先容一下,为后续垂直维度的延伸讲解做铺垫:

1,接口层紧张实现与Web页面、移动客户真个接口交互,定义统一的接口规范,平台最核心的三个接口做事分别是内容(Feed)做事、用户关系做事及通讯做事(单发私信、群发、群聊)。

2,做事层紧张把核心业务模块化、做事化,这里又分为两类做事,一类为原子做事,其定义是不依赖任何其他做事的做事模块,比如常用的短链做事、发号器做事都属于这一类。
图中利用泳道隔离,表示它们的独立性。
其余一类为组合做事,通过各种原子做事和业务逻辑的组合来完成做事,比如Feed做事、通讯做事,它们除了本身的业务逻辑,还依赖短链、用户及发号器做事。

3,资源层紧张是数据模型的存储,包含通用的缓存资源Redis和Memcached,以及持久化数据库存储MySQL、HBase,或者分布式文件系统TFS以及Sina S3做事。

水平分层有一个特点,依赖关系都是从上往下,上层的做事依赖下层,下层的做事不会依赖上层,构建了一种大略直接的依赖关系。

与分层模型相对应,微博系统中的做事器紧张包括三种类型:前端机(供应 API 接口做事)、行列步队机(处理上行业务逻辑,紧张是数据写入)和存储(mc、mysql、mcq、redis 、HBase等)。

垂直延伸技能架构

随着业务架构的发展和优化,平台研发实现了许多卓越的中间件产品,用来支撑核心业务,这些中间件由业务驱动产生,随着技能组件越来越丰富,形成完备的平台技能框架,大大提升了平台的产品研发效率和业务运行稳定性。

差异于水平方向上层依赖下层的关系,垂直方向以技能框架为地基支撑点,向两侧驱动影响业务架构、监控平台、做事管理平台,下面先容一下个中的核心组件。

接口层Web V4框架

接口框架简化和规范了业务接口开拓事情,将通用的接口层功能打包到框架中,采取了Spring的面向切面(AOP)设计理念。
接口框架基于Jersey 进行二次开拓,基于annotation定义接口(url, 参数),内置Auth、频次掌握、访问日志、降级功能,支撑接口层监控平台与做事管理,同时还有自动化的Bean-json/xml序列化。

做事层框架

做事层紧张涉及RPC远程调用框架以及行列步队框架,这是微博平台在做事层利用最为广泛的两个框架。

MCQ行列步队

行列步队供应一种先入先出的通讯机制,在平台内部,最常见的场景是将数据的落地操作异步写入行列步队,行列步队处理程序批量读取并写入DB,行列步队供应的异步机制加快了前端机的相应韶光,其次,批量的DB操作也间接提高了DB操作性能,其余一个运用处景,平台通过行列步队,向搜索、大数据、商业运营部门供应实时数据。

微博平台内部大量利用的MCQ(SimpleQueue Service Over Memcache)行列步队做事,基于MemCache协议,数据持久化写入BerkeleyDB,只有get/set两个命令,同时也非常随意马虎做监控(stats queue),有丰富的client library,线上运行多年,性能比通用的MQ高很多倍。

Motan RPC框架

微博的Motan RPC做事,底层通讯引擎采取了Netty网络框架,序列化协议支持Hessian和Java序列化,通讯协议支持Motan、http、tcp、mc等,Motan框架在内部大量利用,在系统的健壮性和做事管理方面,有较为成熟的技能办理方案,健壮性上,基于Config配置管理做事实现了High Availability与Load Balance策略(支持灵巧的FailOver和FailFast HA策略,以及Round Robin、LRU、Consistent Hash等Load Balance策略),做事管理方面,天生完全的做事调用链数据,做事要求性能数据,相应韶光(Response Time)、QPS以及标准化Error、Exception日志信息。

资源层框架

资源层的框架非常多,有封装MySQL与HBase的Key-List DAL中间件、有定制化的计数组件,有支持分布式MC与Redis的Proxy,在这些方面业界有较多的履历分享,我在这里分享一下平台架构的工具库与SSD Cache组件。

工具库

工具库支持便捷的序列化与反序列化微博中的工具数据:序列化时,将JVM内存中的工具序列化写入在HBase中并天生唯一的ObjectID,当须要访问该工具时,通过ObjectID读取,工具库支持任意类型的工具,支持PB、JSON、二进制序列化协议,微博中最大的运用处景将微博中引用的视频、图片、文章统一定义为工具,一共定义了几十种工具类型,并抽象出标准的工具元数据Schema,工具的内容上传到工具存储系统(Sina S3)中,工具元数据中保存Sina S3的下载地址。

SSDCache

随着SSD硬盘的遍及,优胜的IO性能使其被越来越多地用于更换传统的SATA和SAS磁盘,常见的运用处景有三种:1)更换MySQL数据库的硬盘,目前社区还没有针对SSD优化的MySQL版本,纵然这样,直接升级SSD硬盘也能带来8倍旁边的IOPS提升;2)更换Redis的硬盘,提升其性能;3)用在CDN中,加快静态资源加载速率。

微博平台将SSD运用在分布式缓存场景中,将传统的Redis/MC + Mysql办法,扩展为 Redis/MC + SSD Cache + Mysql办法,SSD Cache作为L2缓存利用,第一降落了MC/Redis本钱过高,容量小的问题,也办理了穿透DB带来的数据库访问压力。

垂直的监控与做事管理

随着做事规模和业务变得越来越繁芜,纵然业务架构师也很难准确地描述做事之间的依赖关系,做事的管理运维变得越来难,在这个背景下,参考google的dapper和twitter的zipkin,平台实现了自己的大型分布式追踪系统WatchMan。

WatchMan大型分布式追踪系统

如其他大中型互联网运用一样,微博平台由浩瀚的分布式组件构成,用户通过浏览器或移动客户真个每一个HTTP要求到达运用做事器后,会经由很多个业务系统或系统组件,并留下足迹(footprint)。
但是这些分散的数据对付问题排查,或是流程优化都帮助有限。
对付这样一种范例的跨进程/跨线程的场景,汇总网络并剖析这类日志就显得尤为主要。
另一方面,网络每一处足迹的性能数据,并根据策略对各子系统做流控或降级,也是确保微博平台高可用的主要成分。
要能做到追踪每个要求的完全调用链路;网络调用链路上每个做事的性能数据;能追踪系统中所有的Error和Exception;通过打算性能数据和比对性能指标(SLA)再回馈到掌握流程(control flow)中,基于这些目标就出身了微博的Watchman系统。

该系统设计的一个核心原则便是低侵入性(non-invasivenss):作为非业务组件,应该尽可能少侵入或者不侵入其他业务系统,保持对利用方的透明性,可以大大减少开拓职员的包袱和接入门槛。
基于此考虑,所有的日志采集点都分布在技能框架中间件中,包括接口框架、RPC框架以及其他资源中间件。

WatchMan由技能团队搭建框架,运用在所有业务场景中,运维基于此系统完善监控平台,业务和运维共同利用此系统,完成分布式做事管理,包括做事扩容与缩容、做事降级、流量切换、做事发布与灰度。

结尾

现在,技能框架在平台发挥着越来越主要的浸染,驱动着平台的技能升级、业务开拓、系统运维做事,本文限于篇幅限定,没有展开先容,后续会不断地先容核心中间件的设计原则和系统架构。

关于作者

卫向军(@卫向军_微博),毕业于北京邮电大学,现任微博平台架构师,先后在微软、金山云、新浪微博从事技能研发事情,专注于系统架构设计、音视频通讯系统、分布式文件系统和数据挖掘等领域