Twitter架构决策

news2024/9/22 1:25:02

技术决策需要在不同限制条件下做出权衡,本文介绍了Twitter早期应对用户大规模增长所做出的技术架构决策。原文:Twitter’s Tough Architectural Decision[1]

Jeremy Bezanger@Unsplash
Jeremy Bezanger@Unsplash

研究大规模互联网应用可以学到很多东西,像Netflix这样的公司,其复杂的架构不仅能够向数百万用户提供内容,而且还改善了用户体验,增加了用户粘性。

在一家小公司中,像推送通知这样的机制可以是主代码库的一部分,并且可以在同一台机器上与应用程序的其他部分一起运行。

但在Netflix,负责推送通知的服务器部署在全球多个数据中心,在本文的最后有一个关于这一架构演进的详细讨论的链接。

虽然学习这些案例研究很有趣,但大多数人仍然没有在如此大的规模下工作的经验。在某些情况下,我们更容易了解公司如何从传统的主流应用服务方式转变为迎合用户体验的现代解决方案。

下面我们以Twitter为例加以说明。

10年前,大约在2012 - 2013年,Twitter呈指数级增长,服务1.5亿用户。

当时Twitter每秒钟处理6000条来自用户的推文。我想说的是,这仍然在可控范围之内,我们拥有高吞吐量的数据库可以处理这一写入速率。

但对于阅读推文的用户来说,就有问题了。当每个用户查询Twitter主页时,必须获取到所关注的每个人的推文组合,这就是每秒钟30万请求!!

如果直接从数据库读取,这个读取速率会让人发疯!

每个请求是什么样子?我举个例子。想象一个人关注了5000个用户,当他打开Twitter网站时,后端使用如下查询访问数据库:

Get all the tweets ordered according to time, if it belongs to any of these 5000 users
如果某个用户在这5000个用户内,获取该用户所有的推文,并按时间排序

即使将查询限制为几条推文,仍然会给数据库带来沉重的负担。

Twitter如何解决容量问题🚀

Twitter有两条时间线:

  1. 用户时间线: 用户自己所有推文的集合,从磁盘中获取。
  2. 主页时间线: 用户关注的人的推文的集合,组成了用户的主页。

在设计数据库时,最简单的数据库只是将所有写操作附加到文件的末尾,并在需要时读取。没有什么比简单的附加到文件中更快的了,但是,随着数据库文件的增长,从这种类型的数据库中查询某些内容将花费很长时间。

为了减少查询时间,我们在其中添加索引。但是添加索引将意味着写入将花费更长的时间,因为必须在将其写入数据库之前编辑索引。但由于读取的数量将远远多于写入的数量,这是一种公平的权衡。

同样,Twitter的阅读量也远远超过了写入量。所以他们构建了一个系统,可以更好的为用户的主页时间线服务。他们预先计算出所有用户的主页时间线,并将其存储在Redis集群中。就这么简单!

现在,无论用户何时发布消息,该消息都会被插入每个关注者的时间线队列中。所以如果你有5000个粉丝,你的推文就会有5000个写操作!!外加上1个数据库本身的写操作😅

这听起来很疯狂,但你仔细想想,这是有道理的。现在可以同时为数百万用户提供服务而不需要访问磁盘,这可以从根本上减少延迟。这个过程叫做扇出(fan-out)

那么到目前为止,Twitter的架构是怎样的呢?

  1. 用户访问Twitter的主页。
  2. Twitter在Redis集群中查找用户的主页时间线。
  3. 一旦找到,就向用户直接展示。
  4. 当用户发送一条推文时,该推文会被复制到用户的所有关注者的时间线上。

还有一些其他的细节:

  1. Twitter维护了一个图数据库 [2],其保存了用户关注关系的所有数据。当发生扇出时,扇出服务查询这个图数据库以确定将推文推送到何处。
  2. 扇出将在数据中心的3台不同的机器上进行复制,即每个用户的时间线存储在3台不同的机器上。这是必需的,因为如果其中一台机器出现故障,其他机器可以作为备份提供服务。
  3. 推文本身并不存储在集群中,而只存储推文ID。推文将在传递给用户的同时被检索出来。
  4. 如果用户超过30天没有登录Twitter,该用户的时间线将不会保存在Redis集群中。对于这类用户,只有当他们返回并向主页时间线发出请求时,才会从磁盘重构他们的时间线。

每个用户的主页时间线上存储的推文数量是有限制的,每次只向用户显示800条推文,这是为了控制内存使用而做出的设计决策!

名人用户的特殊处理💃🏻🕺🏻

上述优化适用于普通用户,但名人有特殊的处理,下面我们以Lady Gaga为例,她当时有大约3100万粉丝。

alt

当Lady Gaga发布推文时,会发生3100万次扇出操作!!而且要复制3次!!

结果就是,有些用户可能会在Lady Gaga的推文发布5分钟后才能看到,因为他们的时间线没有被及时更新。

这就产生了一个不太好的效果,一个可以看到Lady Gaga推文的用户会回复这条推文,这条回复将会在其他用户的时间线中出现,而这些用户还没有收到lady Gaga的原始推文,也许可以称之为无头推文(Headless tweets)🤔

为了避免这种情况,Twitter想出了一种混合方法:

  1. 如果一个人有太多的关注者,那么就不对他们的推文做扇出操作。
  2. 这些用户的推文只有在有人请求主页时才会被合并到时间线中。

又一个简单的解决方案!

总结

研究Twitter的整个架构是非常困难的,尤其是现在已经成为了大公司以后。

但从他们过去解决大规模问题的方式中学习,也可以帮助我们在工作的时候做出决策。即使在成千上万的地方存储一条推文听起来很荒谬,如果能够有效解决问题并且没有任何副作用,这就一个很好的解决方案!

参考
  1. Timelines at Scale [3]
  2. The Infrastructure Behind Twitter: Scale [4]
  3. Scaling Push Messaging for Millions of Devices @Netflix [5]

References:
[1] Twitter’s Tough Architectural Decision: https://dennysam.medium.com/twitters-tough-architectural-decision-c61e4d0d41a5
[2] SQL, NoSQL, Graph: A Commentary on Databases: https://softwareengineeringwk.substack.com/p/nosql-sql-graph-database-types?r=7esi1&utm_campaign=post&utm_medium=web
[3] Timelines at Scale: https://www.infoq.com/presentations/Twitter-Timeline-Scalability/
[4] The Infrastructure Behind Twitter: Scale: https://blog.twitter.com/engineering/en_us/topics/infrastructure/2017/the-infrastructure-behind-twitter-scale
[5] Scaling Push Messaging for Millions of Devices @Netflix: https://www.youtube.com/watch?v=6w6E_B55p0E

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

- END -

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强大而可靠的DiskQ:持久化队列的解决方案

强大而可靠的DiskQ:持久化队列的解决方案 简介: 在软件开发中,处理大量数据和任务调度是常见的挑战。为了有效地处理这些问题,开发人员需要一种可靠的队列解决方案,以确保数据和任务在处理过程中不会丢失。DiskQ作为一种持久化队…

浏览器如果免费安装ChatGPT插件?

一、什么是ChatGPT? ​ ChatGPT是一种基于自然语言处理的机器学习算法,通过大规模的训练数据和优化算法来生成自然语言响应。目前,它在聊天机器人,自动回答问题,自动文本生成等方面有广泛的应用。ChatGPT是由OpenAI公…

[组合数学] 排列组合

文章目录 加法法则 --每一类都能够独立的完成任务乘法法则 --集合论 任务分步骤1000和9999之间有多个具有不同数位的奇数n 7 3 1 1 2 1 3 4 ^311^213^4 3112134 求除尽n的整数个数0到10000之间有多少个整数恰好是有一位数字是5两位数字可以组成多少两位互异且非零的两位数 减…

suricata中command的实现分析和自定义命令方法

suricata提供了suricatasc这个工具用来与其进行通信,比如修改规则文件后,通知suricata重新加载规则,就可以通过suricatasc下发重新加载规则命令,suricatasc和suricata通过unix socket进行通信,unix socke好处就是不占用…

libevent高并发网络编程 - 06_基于libevent的C++线程池实现

文章目录 1 功能简介线程池的初始化线程池执行流程 2 线程池类的设计线程类XThreadXThread.hXThread.cpp 线程池类XThreadPoolXThreadPool.hXThreadPool.cpp 任务基类taskXTask.h 3 自定义任务的例子自定义任务类ServerCMDServerCMD.hServerCMD.cpp 测试程序运行效果 1 功能简介…

华为机试(JAVA)真题Od【A卷+B卷】2023

目录 华为OD机试是什么?华为OD面试流程?华为OD机试通过率高吗?华为OD薪资待遇?华为OD晋升空间? 大家好,我是哪吒。 本专栏包含了最新最全的华为OD机试真题,有详细的分析和Java代码解答。已帮助…

【信息安全案例】——信息内容安全(学习笔记)

📖 前言:在数字化时代,信息内容安全问题越来越引起人们的关注。信息内容安全主要包括对数据的机密性、完整性和可用性的保护,以及对用户隐私的保护等方面。针对信息内容安全的威胁,采取科学有效的安全措施和技术手段至…

每日学术速递5.20

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Improved baselines for vision-language pre-training 标题:改进视觉语言预训练的基线 作者:Enrico Fini, Pietro Astolfi, Adriana Romero-Soriano, Jak…

10-《简单算法》

10-《简单算法》 一、时间复杂度二、空间复杂度三、排序算法1.比较排序1.1冒泡排序:1.2选择排序:1.3插入排序:1.4归并排序(非常重要)1.5快速排序(非常重要)1.6堆排序1.7排序算法稳定性 2.线性排序2.1桶排序2.2计数排序…

数据结构初阶(3)(链表:链表的基本概念、链表的类型、单向不带头非循环链表的实现、链表的优缺点 )

接上次博客:和数组处理有关的一些OJ题;ArrayList 实现简单的洗牌算法(JAVA)(ArrayList)_di-Dora的博客-CSDN博客 目录 链表的基本概念 链表的类型 单向、不带头、非循环链表的实现 遍历链表并打印节点值: 在链…

uni-app小程序uni.navigateBack返回上一个页面并传递参数.返回上个页面并刷新

返回上一个打开的页面并传递一个参数。有种办法就是使用 假如从B页面返回A页面: var pages getCurrentPages(); var prevPage pages[pages.length - 2]; //上一个页面 prevPage.setData({ mdata:1 })经过测试,在uni.app中使用B页面使用setData设置A页…

【Spring篇】AOP案例

🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 一、案例:业务层接口执行效率 1.需求分析 这个需求也比较简单,前面我们在介绍 AOP 的时候已经演示过 : 需求 : 任意业务层接口执行均可显示其执行效率(执行时长&…

如何选对适合你的FPGA?快速掌握选型技巧!

FPGA厂家和芯片型号众多,在开发过程中,特别是新产品新项目时,都会面临FPGA选型的问题。 如何选择出适合的FPGA型号非常关键,需要评估需求、功能、成本、存储器、高速收发器等各种因素,选出性能与成本平衡的FPGA芯片。…

从零玩转设计模式之外观模式-waiguanmos

title: 从零玩转设计模式之外观模式 date: 2022-12-12 15:49:05.322 updated: 2022-12-23 15:34:40.394 url: https://www.yby6.com/archives/waiguanmos categories: - 设计模式 tags: - 设计模式 什么是外观模式 外观模式是一种软件设计模式,它提供了一种将多个…

进阶必看:高速PCB Layout设计的技术指南

当今电子行业中,高速PCB电路越来越广泛,已成为当代PCB工程师的重要技能,而在高速PCB电路中,高速PCB Layout设计是一项高难度高技术的工作,其设计质量直接关系到电路的性能。所以做好PCB Layout设计是非常非常重要的。 …

Boost开发指南-1.2progress_display

Progress_display progress_display可以在控制台上显示程序的执行进度,如果程序执行很耗费时间,那么它能够提供一个友好的用户界面,不至于让用户在等待中失去耐心。 progress_display位于名字空间boost,为了使用progress_displa…

内网自建代理ChatGPT

使用GPT比较频繁,一开始翻墙还能接受,但是用美国节点访问其他国外网站,确实比较麻烦。因此决定自己转发一个出来。 一、获取OpenAI授权密钥 首先,进入platform.openai.com-Personal-View API keys 不过OpenAI的key并不是免费的&…

VMware虚拟机三种网络模式详解之Bridged(桥接模式)

VMware虚拟机三种网络模式详解 Bridged(桥接模式) 由于Linux目前很热门,越来越多的人在学习Linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常…

登高作业安全带穿戴识别系统 yolov5

登高作业安全带穿戴识别系统通过yolov5python网络框架模型技术,登高作业安全带穿戴识别算法模型实现对登高作业人员是否穿戴安全带进行监测并及时发出警报。YOLO系列算法是一类典型的one-stage目标检测算法,其利用anchor box将分类与目标定位的回归问题结…

前端web入门-HTML-day02

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 列表 无序列表 有序列表 定义列表 表格 基本使用 合并单元格 跨列合并 跨行合并 表单 input …