写点什么

亿级用户下的新浪微博平台架构

2015 年 1 月 19 日

【编者按】《博文共赏》是 InfoQ 中文站新推出的一个专栏,精选来自国内外技术社区和个人博客上的技术文章,让更多的读者朋友受益,本栏目转载的内容都经过原作者授权。文章推荐可以发送邮件到 editors@cn.infoq.com

序言

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

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

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

在此基础上又经过长时间的重构、线上运行、思索与沉淀,平台形成了第三代架构体系。

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

第三代技术体系

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

如上图所示,正交分解法将整个图分解为 3*4=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 由技术团队搭建框架,应用在所有业务场景中,运维基于此系统完善监控平台,业务和运维共同使用此系统,完成分布式服务治理,包括服务扩容与缩容、服务降级、流量切换、服务发布与灰度。

结尾

现在,技术框架在平台发挥着越来越重要的作用,驱动着平台的技术升级、业务开发、系统运维服务,本文限于篇幅限制,没有展开介绍,后续会不断地介绍核心中间件的设计原则和系统架构。

本文首发于“微博平台架构”微信公众号,发布时有少量的文字润色和调整。

关于作者

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


感谢臧秀涛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015 年 1 月 19 日 04:4944068

评论

发布
暂无评论
  • 百度技术沙龙第 1​5 期回顾:​设计可靠而实时的社区型网站(含资料下载)

    在6月25日百度主办、InfoQ策划组织实施的第15期百度技术沙龙活动上,来自百度贴吧的技术负责人,百度搜索研发部技术委员会成员李瀚以及去哪儿网酒店技术总监杨淼分别分享了构建社区型网站的相关话题,话题涉及百度贴吧的架构实践以及去哪儿网“知道”的设计经验。本文将对他们各自的分享做下简单的回顾,同时提供相关资料的下载。

  • Deis v1.0 发布

    Deis是一款基于Docker和CoreOS的开源Paas平台,旨在让你能够容易地在服务器上部署并管理应用程序。它能够部署任意可在Docker容器中运行的应用或者服务;在语言和框架层面,除了可以使用Docker容器之外, Deis还为Ruby、Python、Node.js、Java以及Scala等语言提供了Heroku构建包。Deis能够被部署到所有支持CoreOS的系统上。最近,Deis发布了第一个稳定版本v1.0.0,该版本包含了稳定的API,广泛的特性以及固定的组件架构,标志着它已经可以应用于产品环境。

  • 当当 11·11:高可用移动入口与搜索新架构实践

    2017年,当当较为全面地更新了其系统,一年一度的电商大促,正是考验其系统能力的时候。文章从应用限流、链路监控、APM、移动端网关和搜索系统几个模块,为读者分享了当当更新系统所做的点点滴滴。

  • 开源服务注册中心如何选型?

    对于大多数中小规模团队来说,我的建议是最好使用业界开源的、应用比较成熟的注册中心解决方案,把精力投入到业务架构的改造中,不要自己造轮子。

    2018 年 9 月 20 日

  • 新技术层出不穷,HDFS 依然是存储的王者

    如果我们将大数据计算比作烹饪,那么数据就是食材,而Hadoop分布式文件系统HDFS就是烧菜的那口大锅。

    2018 年 11 月 10 日

  • 我眼中的云端架构

    每个人心中都有自己的一朵云,在我设想中,应该存在这么一种公有服务,它能够帮助用户随时随地的获取自己的数据,与朋友交流,获取好友最新状态。在这服务之上,我们有这么一个平台,它能够给用户提供二次开发的接口,让开发者根据用户数据开发丰富的展现层,并且提供这些展现层的运行平台。

  • 转转数据中台技术架构方法论与实践

    讲师简介2016 年 4 月加入转转担任数据中台负责人,在转转从 0开始组建数据产品、研发、架构、统计分析团队,为 30+ 部门产品运营、战略分析、数据挖掘团队提供各类工具平台、数据及产品支持,赋能业务。此前先后在腾讯、58 同城从事大数据研发、架构、管理工作。 十年的大数据研发、架构、管理,积累了丰富的互联网大数据行业经验,有完整的数据平台、基础架构搭建经验,团队成员从 0 到 100 的管理经验。对数据体系与中台建设、数据仓库及其业务应用、产品落地等亦有深厚认知与丰富的实践经验。

    2020 年 1 月 3 日

  • 化茧成蝶: Go 在 FreeWheel 服务化中的实践

    近一年来,FreeWheel正在将业务系统迁移到微服务架构,而Go语言因其原生对HTTP服务开发的良好支持及易于容器化部署的特点,成为我们微服务开发的首选语言。

  • 从虚机到容器,秒拍架构师告诉你如何平滑进行业务迁移

    用户无感知的前提下完成的,秒拍是如何做到的?

  • 腾讯重磅开源分布式 NoSQL 存储系统 DCache

    腾讯最近开源了一个分布式 NoSQL 存储系统 DCache,它的典型应用场景在分布式缓存。我们第一时间采访了 DCache 研发团队成员山宝银,进一步了解项目的研发背景与相关技术细节。

  • 从无到有:微信后台系统的演进之路

    2011.1.21 微信正式发布。这一天距离微信项目启动日约为2个月。就在这2个月里,微信从无都有,大家可能会好奇这期间微信后台做的最重要的事情是什么?

  • 微博 CacheService 架构浅析

    为了满足业务的发展需要,微博平台开发了一套高性能高可用的CacheService架构用于支撑现有线上的业务系统的运转。但“冰动三尺非一日之寒”,微博的Cache架构也是经历了从无到有,不断的演进过程。

  • 微博“异地多活”部署经验谈

    InfoQ近日采访了阿里巴巴的研究员毕玄,了解了他们的数据中心异地多活项目的来龙去脉。除了以阿里巴巴为代表的电商类互联网公司,其他公司,像新浪微博,也有自己的经验,本文就是新浪微博“异地多活”部署的经验总结。

  • 美团点评万亿级 KV 存储架构与实践

    本次分享介绍美团点评的 KV 存储 Cellar 和 Squirrel 架构、服务优化实践以及 KV 存储的技术发展趋势。

  • Istio:Service Mesh 的代表产品

    随着技术发展,现在来看Linkerd可以说是第一代Service Mesh产品,到了今天当我们再谈到Service Mesh时,往往第一个想到的是Istio。

    2018 年 11 月 8 日

  • 如何搭建一个可靠的监控系统?

    我以几个常见的监控系统实现方案,谈谈它们的实现原理,分别适用于什么场景,以及具体该如何做技术选型。

    2018 年 9 月 25 日

  • HTAP 是不是赢者通吃的游戏?

    进入大数据时代后,OLAP系统需要更快地反映业务的变化。HTAP要解决的就是OLAP的时效问题,不过它也不是唯一的选择。

    2020 年 9 月 18 日

  • Redis 如何分布式,来看京东金融的设计与实践

    R2M 是京东金融线上大规模应用的分布式缓存系统,目前管理的机器总内存容量超过 60TB,近 600 个 Redis Cluster 集群,9200 多个 Redis 实例。其主要功能包括:全 web 可视化运维、缓存集群一键部署、资源池统筹管理、在线扩容及快速数据迁移、多机房切换及容灾、完善的监控及告警、Redis API 兼容等。本文将从 R2M 系统架构、资源管理、集群扩容与迁移、数据冷热交换、多机房容灾等多方面进行深入剖析,希望读者能有所收获。

  • 苏宁大促高并发要求下的售后服务运营能力承诺服务系统架构实战

    苏宁售后服务运营能力承诺服务系统(简称“ASAP”)是物流研发中心建设的针对苏宁售后服务的时效承诺管理和服务运营能力管理的核心支撑系统,ASAP系统经历两年多的线上考验与技术迭代,目前服务着成万级商家,亿级SKU。

发现更多内容

北漂七年Java开发的一路辛酸史:面试腾讯、阿里、美团、字节后的一点心得

Java架构之路

Java 程序员 架构 面试 编程语言

微服务网关的技术架构

积极&丧

分布式缓存架构设计和一致性HASH

我们新四军不拿群众一针一线

Spring源码高级笔记之——Spring AOP应用

Java架构师迁哥

久等了,Rancher 2.5中文文档新鲜出炉

RancherLabs

容器 k8s

工作1-3年的Java工程师们,如何变得更值钱?,这2个点帮你8个月达到阿里P7水平

Java成神之路

Java 程序员 架构 面试 编程语言

星环科技作为信通院隐私计算联盟成员亮相2020数据资产管理大会

星环科技

大数据

架构师训练营 第十周作业

文江

bit位操作及其算法应用

Skysper

算法 位运算

科技抗疫,少年可期,为这群有AI的天使开发者疯狂打call

华为云开发者社区

人工智能 华为云 modelarts 医疗AI 对象存储服务OBS

写技术文章给我带来什么好处?

小林coding

程序人生

面试官:小伙子我们先来唠唠并发编程的几大核心知识点

程序员小毕

Java 架构 面试 并发编程 AQS

史上最全1000道Java高频面试题:集合、IO流、多线程、网络、算法、Git、设计模式、springboot

Java架构之路

Java 程序员 架构 面试 编程语言

职责链模式

soolaugust

设计模式 七日更 职责链模式

思考-国际化系统表结构设计

BerryMew

Presto入门

HQ数字卡

presto 七日更

一个月吃透这份阿里高级专家的《Java500道面试手册》成功拿下了腾讯offer!

Java架构之路

Java 程序员 架构 面试 编程语言

四年Java开发,面试核心知识点(腾讯+阿里+快手面经)附答案

Java成神之路

Java 程序员 架构 面试 编程语言

2021年阿里、腾讯、百度、华为、京东、美团和滴滴最新Java面试题汇集!

Java架构之路

Java 程序员 架构 面试 编程语言

注册中心Eureka源码解析

李浩宇/Alex

华为大佬亲自手码Dubbo服务暴露源码解析!这次够清楚了吧

比伯

Java 编程 架构 程序人生 计算机

TypeScript | 第六章:理解声明合并,以及编写声明文件

梁龙先森

typescript 前端 七日更

【mybatis-plus】什么是乐观锁?如何实现“乐观锁”

Java架构师迁哥

第十周作业

Jack

瞬间起飞!腾讯大神纯手撸“架构师成手册”网友看完直呼NB!

比伯

Java 编程 架构 面试 计算机

亚马逊 CTO 预测 2021 将改变世界的八大技术趋势:云加速向边缘推进

亚马逊AWS官方博客

云计算 AWS

谷歌大佬回国发展,吊打各大厂面试官!吐血总结大厂面试高频点及笔记解析

Java成神之路

Java 程序员 架构 面试 编程语言

金融知识图谱的构建与应用

DataFunTalk

AI 知识图谱

大厂offer直通车:并发编程28题+JVM21题+Redis 16题+Java集合22题

Java架构之路

Java 程序员 架构 面试 编程语言

Multi-Architecture镜像制作指南已到,请查收!

华为云开发者社区

Docker Kubernetes 容器 镜像 Multi-Architecture

第十周课后练习

晴空万里

极客大学架构师训练营

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

亿级用户下的新浪微博平台架构-InfoQ