twitter系统架构分析

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 58沈剑:原文作者不容易,收集了好些资料,此文以作阅读笔记。

image.png

twitter系统架构分析

(一)twitter的核心业务

twitter的核心业务,在于following和be followed:
(1)following-关注
进入个人主页,会看到你follow的人发表的留言(不超过140个字),这是following的过程;
(2)followed-被关注
你发布一条留言,follow你的人将看到这条信息,这是be followed的过程;

(二)twitter的业务逻辑

twitter的业务逻辑也不复杂
following业务,查follow了哪些人,以及这些人发表的留言;
followed业务,前端js轮询后端,看follow了的人有没有新留言,有则更新(更新及时性取决于轮询时间);

(三)三层架构(three-tier architecture)

网站的架构设计,传统的做法是三层架构,所谓“传统”不意味着“过时”,新潮的技术不成熟,传统的路子更稳健。
(1)表示层(presentation tier):apache web server,主要任务是解析http协议,将请求分发给逻辑层;
(2)逻辑层(logic tier):mongrel rails server,利用rails现成的模块,降低工作量;
(3)数据层(data tier):mysql;

数据层先来吧:
twitter的核心是(1)用户;(2)消息;(3)用户关系;
围绕这几个核心,其核心数据的schema设计:
(1)用户表user
id, name, pass, status, …
(2)消息表msg
msgid, author_id, msg, time, …
(3)用户关系表relation
id, following_ids, followed_ids

逻辑层:
当用户发布消息时,依次执行:
(1)存消息至msg表;
(2)查用户relation表,找出其followed_ids;
(3)获取followed_ids中用户的状态;
(4)在线的ids,将消息push进一个队列queue;
(5)queue中的msg,更新ids的主页;
这里面要用到队列,其实现方式有很多种,例如apache mina,twitter团队自己实现了一个kestrel。

表示层:
表示层的主要职能有2个:
(1)http协议处理(http processor);
(2)分发器(dispatcher);
当然,访问twitter的不仅仅是浏览器,可能还有手机,由于可能存在其他协议,故可能存在其他processor。

无论如何,架构框架清晰如下:

image.png

图1:架构版本1

(四)cache=cash即缓存等于收入

cache的使用对大型网站架构至关重要,网站响应速度是影响用户体验最明显的因素,而影响响应速度最大的敌人又是磁盘io。
twitter工程师认为,良好体验的网站平均响应时间应该在500ms左右,理想的时间是200-300ms。
关于cache的使用,是twitter架构的一大看点,带cache的架构清晰如下:

image.png

图2:带cache架构版本2

哪里需要cache?IO越频繁的地方,越需要cache。
数据库是IO访问最频繁处,三大核心表是否有必要放入内存中?
twitter的做法是,将表拆分,将其中访问最频繁的字段装入cache。
(1)vector cache and row cache即数组cache与行cache
vector cache:新发表消息的msgids,相关作者的ids,这些id的访问频率很高,存放它们的cache称为vector cache;
row cache:消息正文的行cache;
内存有限的情况下,优先vector cache,实际结果vector cache的命中率是99%,row cache为95%;

(2)fragment cache and page cache
访问twitter的用户除了网页(web通道),还有手机(API通道),而后者的比例占总流量的80%-90%。
mysql cache之外,cache的重心会在API通道上。
手机屏幕的主体,是一屏一屏的消息,不妨把整个页面分割成若干局部,每个局部对应一些/一条消息,这些就是fragment。
人气高的作者,缓存其页面的fragment,可以提高读取其发布消息效率,这就是fragment cache的使命。
人气旺的作者,人们也会访问其主页,这就是page cache的使命。
实际结果,fragment cache的命中率为95%,page cache为40%。
虽然page cache的命中率低,但由于是访问主页,其占用的空间是很大的,为了防止两种cache相互影响,这两种cache需要部署在不同的物理机器上。
twitter的fragment cache和page cache都是使用的memcached。

(3)http accelerator
web通道的缓存问题也需要解决,分析之后,web通道的压力主要来自搜索。
面临突发事件时,读者们会搜索相关信息,而不会理会这些信息的作者是不是自己follow的那些人。
为了降低搜索压力,可以将搜索关键词与搜索内容cache起来,这里,twitter的工程师使用了varnish。
有趣的是,varnish通常部署在web server外层,先访问varnish,其中没有先关的内容,才访问web server;
twitter的工程师却将varnish放在apache web server的内层,原因是他们认为varnish操作复杂,担心varnish崩溃造成系统的瘫痪,故采用了这种保守型部署方式。
twitter没有公开varnish的命中率,他们声称,使用了varnish之后,整站的负载下降了50%。

(五)抗洪需要隔离

twitter架构的另一大看点是其消息队列:隔离用户的操作,将流量高峰摊平。
餐厅客满时,对于新来的顾客,虽然不能服务,但不是拒之门外,而是让他们现在休息厅等待。
用户访问twitter时,接待他的是apache web server,而apache不能接待无限多的用户。
2009年1月20日,奥巴马发表就职演说,twitter流量猛增,此时如何是好。
面对洪峰,如何保证网站不奔溃?迅速接纳,但推迟服务。
apache收到请求,转发给Mongrel,由Mongrel负责实际处理,apache则腾出手来,迎接下一位用户。
但apache能够接待的用户数总是有限的,它的并发数受apache能够容纳的工作进程数量,这里不细究apache内部原理,图如下:

image.png

图3:apache内部架构

(六)数据流与控制流

快速接纳,推迟服务,只是缓兵之计,目的是让用户不至于收到503(service unavailable)。
真正的抗洪能力,体现在蓄洪与泄洪两个方面:
(1)twitter有庞大的memcached集群,能大容量蓄洪;
(2)twitter自己的kestrel消息队列,作为引流泄洪手段,传递控制指令(引流和渠道);
洪峰到达时,twitter控制数据流,将数据及时疏散到多个机器,避免压力集中,造成系统瘫痪。
下面举例说明twitter内部流程,假设有两个作者,通过浏览器发消息,一个读者也通过浏览器阅读他们的消息。

image.png

图4:twitter流

(1)登陆apache web server,apache分配一个工作进程为其服务,登陆,查id,写cookie等;
(2)上传新写的消息,把作者id,消息等转发给Mongrel,apache等待Mongrel回复,以便更新作者主页,将新写的消息更新上去;
(3)Mongrel收到消息后,分配一个msgid,将其与捉着id等缓存到vector memcached上去;
同时,Mongrel让vector memcached查找作者被哪些人follow,缓存如果没有命中会去后端mysql查找,并入cache;
读者ids会返回给Mongrel,Mongrel把msgid与短信正文缓存至row memcached;
(4)Mongrel通知kestrel消息队列服务器,每个作者及读者都有一个队列(没有则创建);
Mongrel将msgid放入读者的队列,以及作者本人的队列;
(5)某一台Mongrel,它可能正在处理某一个id的队列,就会往返回该id用户的主页上添加上此条信息;
(6)Mongrel将更新后作者的主页给前端等待着的apache,apache则返回浏览器。

(七)洪峰与云计算

不细说了,洪峰扛不住时,只能加机器。
机器哪里来?租云计算平台公司的设备。
当然,设备只需要在洪峰时租用,省钱呀(@58沈剑 疑问:twitter怎么知道什么时候是洪峰?)。

(八)push与pull的折衷

可以看到,Mongrel的工作流程:
(1)将相关ids放入vector memcached和row memecached就算消息发布成功,而不负责mysql数据库的存入;
(2)将相关msgid放入kestrel消息队列就算消息推送成功;
Mongrel没有使用任何方式去通知作者、读者,让他们重新拉取消息。
上述工作方式,反映了twitter架构设计“分拆”的理念:
(1)将一个完整的流程分拆成独立工作的子流程,一个工作可以由各个服务负责(三层架构本身是一种分拆);
(2)多机器之间协作,细化数据流与控制流,并强调其分离;

twitter业务流程的分隔,是一种事件驱动式的设计,主要体现在两个方面:
(1)Mongrel与mysql的分离,前者不直接插手mysql的操作,而委托memcached全权负责;
(2)上传、下载逻辑分离:只通过kestrel队列来传递指令;

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
10月前
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
12月前
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
7月前
|
Java API 开发工具
灵码产品演示:软件工程架构分析
本演示展示灵码对复杂软件项目的架构分析与文档生成能力。通过Qwen3模型,结合PlantUML,自动生成系统架构图、微服务时序图,并提取API接口文档,实现高效、智能的代码理解与文档输出。
397 5
|
7月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
11月前
|
机器学习/深度学习 人工智能 算法
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
该研究系统梳理了大型多模态推理模型(LMRMs)的技术发展,从早期模块化架构到统一的语言中心框架,提出原生LMRMs(N-LMRMs)的前沿概念。论文划分三个技术演进阶段及一个前瞻性范式,深入探讨关键挑战与评估基准,为构建复杂动态环境中的稳健AI系统提供理论框架。未来方向聚焦全模态泛化、深度推理与智能体行为,推动跨模态融合与自主交互能力的发展。
844 13
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
2590 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
8月前
|
存储 前端开发 JavaScript
如何开发设备管理系统中的经验分析报表板块 ?(附架构图+流程图+代码参考)
设备管理系统(EMS)助力企业高效管理设备生命周期,涵盖采购、维护到报废全流程。本文详解经验分析报表模块设计与开发,涵盖动态看板、点检、巡检、维修、保养及库存统计功能,提供代码示例与架构设计建议,提升设备管理效率与决策水平。
|
安全 数据处理 数据安全/隐私保护
C/S架构与B/S架构的适用场景分析
C/S架构(客户端/服务器架构)与B/S架构(浏览器/服务器架构)在适用场景上各有特点,主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。
1426 6
|
10月前
|
运维 监控 数据可视化
一文详解:工业软件“低代码开发平台”技术架构研究与分析
本文围绕工业软件低代码开发平台的机遇与挑战,提出基于自动化引擎的技术架构,由工具链、引擎库、模型库、组件库、工业数据网关和应用门户组成。文章分析了其在快速开发、传统系统升级中的应用模式及价值,如缩短创新周期、降低试错成本、解决资源缺乏和提升创新可复制性,为我国工业软件产业发展提供参考和支持。
|
10月前
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
831 0

热门文章

最新文章