今日头条架构师:头条1.2亿+日活的微服务和高可用架构实践
ahcoder 2025-07-01 16:25 3 浏览
01
业务高速发展下的架构演进
今日头条作为国民级资讯阅读App,2019年用户规模超6.5亿人,日活1.2亿+,视频播放量占头条整体65%+,头条号文章发布量超1.6亿,视频发布量超1.5亿。
今日头条系统,在稳定性可用性方面压力比较大,一方面需要快速把业务实现,但在另外一方面,类似这些高可用的问题会经常骚扰工程师:上线就挂、运营活动量大服务崩溃、单机性能顶不住、一个小服务上线把核心服务搞挂了……类似这些问题,技术团队需要如何更好的去应对?
架构演进,在不同阶段的公司都会面临各种压力。小公司压力可能是业务没起来,QPS 很低,要做优化也没有环境及条件。当公司大了,服务器可能已经不是问题,但你要不断考虑调优及应对访问压力,改善基础设施以提供更稳定的开发环境。所以说架构演进是持续一个过程,没有终点。
02
今日头条架构发展的三个阶段
第一阶段:传统的三层架构、单体架构
今日头条刚开始做的时候,就是一个简单 Web 应用,搭个数据库,把业务实现就行了。头条最开始的优势是推荐引擎,还有另外一套数据挖掘和离线计算。在线的服务在前端相对来讲模式还是比较清晰的,三层就搞定了。业务刚开始起来的时候,没什么问题,访问增大水平扩展一下就可以解决。
第二阶段:系统拆分、打散
跟大多数的架构演进历史非常类似,系统遇到性能瓶颈后,最简单就做一些拆分。优化的过程中,就是把压力较大的子系统就从代码上进行拆分,分成多个可独立部署、无状态化的服务。
这个阶段可以把SSO、用户中心、文章中心、视频、评论等拆分出来,每个业务中心都可以集群部署,达到加机器就可以解决性能问题的效果。
随着业务的快速发展,代码和架构上的包袱是比较沉重,改造的成本比较高。基于这些问题,就要开始演进到下一个阶段,微服务。
第三阶段,微服务,中台化架构
通过拆分成子系统,大的应用拆成小应用,抽象通用层做代码复用。重点在基础设施,希望通过基础设施提高快速迭代、容灾和一系列的工作,希望各个业务团队能更快做业务上的迭代以及架构上的调整。
(微服务架构)
(微服务架构)
微服务最关键的三点:
1、解耦,一个服务会依赖另外一个服务、模块或子服务的概念。
2、轻量,减轻维护人员的成本。
3、易管理。
03
头条的服务化架构建设思路
立规范。包括部署RPC规范、服务调用规范、服务治理原则、超时重试机制等等,否则规模大了之后就会是个灾难。
打基础。有了规范以后,开始真正落地的服务。比如说基础库,把Ngnix、Redis、MySQL这些库封装起来,统一起来做一些开发框架,做业务系统开发的时候,就不用关注数据层的细节,专心实现业务逻辑。
渐进。先拆离再迭代,逐步把服务优化起来。
一切都是服务。第四点是和其他公司或团队稍不一样的地方,我们的想法是一切都是服务,每个节点都是抽象归属于某一个具体的服务。存储的确是一个服务,但它不只是提供 API 或者提供功能的东西,还需要包括服务质量,需要别人用起来是比较简单的。
平台化。最后的落地是平台化的东西。我们框架是怎么设计,和服务怎么结合?
一切都是服务:
资源是有限的:按需申请,需申请和授权;
简单的使用方式:开发者只需要关注业务;
有唯一定位的方式:用全局资源定位;
核心规范:
必须要有全局的中心,服务统一注册到 consul 中;
服务有唯一的标示、命名范:{产品线}.{子系统}.{模块} P.S.M,公司有很多部门,我们不希望部门之间沟通起来有差异,所以需要有全局规划去追溯它;
业务服务使用 Thrift 描述接口、必须传递标准参数。如果用弱的描述数据,没有强约束,在客户端的数据可能会出现类型错误;
RPC 使用统一收敛的库;
Nginx、Redis、MC、MySQL、etc 都是服务
服务注册:我们服务统一使用 loader 或 wrapper 脚本启动,具体启动由业务决定。服务启动会有一个全局唯一ID,把 app 注册到服务里面。
服务中心
服务中心有服务信息,会同时带上是什么样的服务,其他人比较简单的调这个服务就 OK 了。这个服务到底提供什么样的服务质量,拥有者可以管理这个信息。Redis去服务,负载均衡,服务一个项目,把服务接上去。
服务关系与授权
服务之间有个关键的概念:服务授权。一般我们起一个服务,通过 IP 就可以连上它了。数据库有用户名认证,也可以对 IP 授权。不过内网很多服务限制比较少,不是所有服务都有授权认证。我们希望把服务之间的关联关系,全局拓扑关系记录下来并且可执行。
04
头条服务拓扑架构图
服务依赖和被依赖的全局关系拓扑图,服务变更影响范围评估,服务治理,监控预警基础,需要经常更新维护。
05
头条RPC开发框架设计思路
建设关键点:
1、快速开发,代码生成
2、服务发现,服务的自动发现、服务注册
3、可观测,logid、pprof、admin端口
4、容灾降级,业务降级开关
5、过载保护,熔断器、调用控制
6、多开发语言异构系统
06
基于容器的云原生微服务
基于容器技术的云原生微服务,将敏捷开发、devops完美融合,服务化理念的落地与业务场景结合, 实现端到端的价值交付。
以上介绍了今日头条架构高可用、微服务、容器化等实践
作者:作者,夏绪宏。今日头条架构师,专注对高性能大规模 Web 架构,云计算、性能优化、编程语言理论等方向,PHP committer,HHVM 项目贡献者。2015 年加入今日头条负责基础设施,系统架构设计和优化,解决大流量高并发下的系统性能、可靠性和运维效率等方面的问题。
相关推荐
- 写一个Nginx的模块没有那么难(nginx模块化)
-
Nginx作为世界第二大Web服务器(第一是Apache),越来越受到大家的青睐。受到欢迎的一个重要原因,是他的高扩展性。它是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。当我们开发自己的...
- Rocky Linux 9.x 从零安装 Nginx 全流程:源码编译 + dnf 安装方案详解
-
0.前言本文目标,安装nginx提供http访问git仓库。关于这篇只是再续,还有续集...以下安装主要的过程都是在root用户下进行,如果是非root用户,请使用sudo获取root权限执行命令。1...
- RockyLinux 9快速部署Nginx+HTTPS(基于DNF安装)
-
RockyLinux9快速部署Nginx+HTTPS(基于DNF安装)针对RockyLinux9用户,通过DNF包管理器快速搭建Nginx服务并配置HTTPS加密,以下是优化后的实战流程,兼顾效率...
- 如何在openEuler 24.03 LTS部署Zabbix 7.0 LTS之源码编译安装
-
由于openEuler24.03LTS系统无法通过Zabbix官网提供的RPM包来安装Zabbix7.0LTS软件,因此只能采取源码编译的方式进行安装,选择MySQL数据库和Nginxweb...
- 搭建自己的前端服务器环境—Node、MySQL、Git和Nginx等一网打尽
-
前言作为前端开发者一直都在关注浏览器的行为、表现。但是时间长了免不了要接触到后端的知识、服务器的知识。尤其是在前端技术爆发式发展的当下,前端慢慢的渗透到了更多的领域。比如,使用express/koa...
- 跟我学Nginx(三)——Centos8安装Nginx
-
Nginx有window版本,也有Linux版本,我的工作环境都是基于Linux,所以今天主要讲讲如何在Linux下安装Nginx,以Centos为例进行说明。一.下载Nginx从Nginx的官网(h...
- 04《Nginx 入门教程》Windows 下安装 Nginx
-
在Windows上安装Nginx时一件非常简单的事情,因为连编译都不用,直接开箱使用。接下来,我们在Windows7上搭建Nginx服务并简单使用起来。1.下载Nginx最新稳...
- nginx负载均衡配置(nginx负载均衡配置两个程序副本)
-
Nginx是什么没有听过Nginx?那么一定听过它的“同行”Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(UniformResources...
- 内测分发平台应用的异地容灾和负载均衡处理和实现思路?
-
在软件开发过程中,内测分发平台扮演着至关重要的角色。它不仅帮助开发者将应用程序传播给内部测试人员,还负责收集反馈、跟踪错误并改进产品。然而,为了确保一个平稳、连贯的内测过程,对内测分发平台实施异地容灾...
- SpringBoot 项目处理跨域的四种技巧
-
上周帮一家公司优化代码时,顺手把跨域的问题解决了,这篇文章,我们聊聊SpringBoot项目处理跨域的四种技巧。1什么是跨域我们先看下一个典型的网站的地址:同源是指:协议、域名、端口号完全相...
- 确保 Nginx 网络服务器的安全(nginx 安全防护)
-
在数字时代,网络安全已成为一个亟待解决的问题。随着网络攻击的增加,确保网络服务器安全对保护敏感数据和维护网站完整性至关重要。本博文将指导你如何配置Nginx(一种流行的开源网络服务器软件),以保护服...
- 三条命令部署 Jira 和 Confluence,我为什么写了这个小工具?
-
这两天,趁着Team'25大会的余温,我回顾了一下自己过去这些年和AtlassianDataCenter(以下简称DC)打交道的经历。Mike在会上提到,Isolated...
- 前端域名、端口、协议一样,本地缓存可以共享吗?
-
是的,前端在域名、端口、协议都相同的情况下,本地缓存(localStorage、sessionStorage、cookie等)是可以共享的,具体如下:本地缓存能否共享的判断标准:缓存类型是否共享的...
- 如果给nginx写插件,基于何种语言实现
-
Nginx插件开发主要基于以下几种语言和技术栈,具体选择取决于插件类型、性能需求和开发复杂度:1.C语言(原生模块)特点:直接编译到Nginx核心,性能最优,适合高性能要求的底层功能(如负载均...
- 《云计算故障排查:网站突然打不开,咋办?》
-
云计算故障排查:网站突然打不开,咋办?——用“医院急诊室”类比,5分钟学会“网络急救术”一、先抛结论:网站崩了≠“世界末日”,按“急诊流程”快速排查网站突然打不开,就像病人突然倒地——慌乱中乱投医只会...
- 一周热门
- 最近发表
-
- 写一个Nginx的模块没有那么难(nginx模块化)
- Rocky Linux 9.x 从零安装 Nginx 全流程:源码编译 + dnf 安装方案详解
- RockyLinux 9快速部署Nginx+HTTPS(基于DNF安装)
- 如何在openEuler 24.03 LTS部署Zabbix 7.0 LTS之源码编译安装
- 搭建自己的前端服务器环境—Node、MySQL、Git和Nginx等一网打尽
- 跟我学Nginx(三)——Centos8安装Nginx
- 04《Nginx 入门教程》Windows 下安装 Nginx
- nginx负载均衡配置(nginx负载均衡配置两个程序副本)
- 内测分发平台应用的异地容灾和负载均衡处理和实现思路?
- SpringBoot 项目处理跨域的四种技巧
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- linux 防火墙 (33)
- linux 镜像 (34)
- linux ip地址 (34)
- linux 用户查看 (33)
- nginx配置 解析 (37)
- nginx 频率限制 (34)