Design A Twitter

news2025/7/12 11:23:00

title: Notes of System Design No.04 —Design a Twitter
description: ’ Design a Twitter ’
date: 2022-05-14 09:50:32
tags: 系统设计
categories:

  • 系统设计

00.What is Twitter

注:TimeLine 就是按照时间顺序显示的信息流

01. Functional Requirements

  • 1.发布推特
  • 2.删除推特
  • 3.主页信息流
  • 4.用户页面信息流
  • 5.关注
  • 6.搜索
  • 7.点赞

02. Non-Functional Requirements

  • 一致性
    每次都能读取到最新的数据
  • 可用性
    每次刷新都不会报错,并不用求保证必须得到最新的数据,高可用性的前提是这个系统必须是可扩展的,保证系统在很多拥塞的时候,也能够很好的返回数据。
  • Partition Tolerance(Fault Tolerance)

系统丢包了,或者有几个设备宕机了 或者有几个磁盘坏掉了 不影响系统运行

03. Assumption

关键指标

  • 200m的DAU 100m的新推特
  • 每个用户每天看timeline 5次,看别的用户timeline 3次
  • 每个timeline 有20条数据
  • 每个推特有280个字节(因为限制了每个推特是140个字符)
  • 每个推特的元数据(发布时间 发布地点等等) 限制了是30个字节
  • 20%的推特含有照片 每个照片200kb
  • 10%的推特含有视频 30%的视频会被观看 每个视频2MB

存储估算

带宽估计


注:

  • 200M 表示的是DAU
  • 20表示的是每个Timeline显示的推特数量

04. API

注:

  • readHomeTimeLine 中有的参数pageSize表示设定的每个page的推特数量,因为不同的终端屏幕大小不一样 需要显示的推特数量也不一样。pageToken表示当前的页码,如果不设定的话 默认显示最新的页号所对应的推特

05.High Level Design

Sceranio1 :Post twieets 发布推特

Sceranio2 :Visit Uesr TimeLine 访问用户的TimeLine

每次读取某个用户的timeline都比较费时间,可以采用的改进措施是采用Cache.

  • 用户每次发布推特的时候 把他最新的推特写入到cache
  • 然后读取的时候 直接读取cache就可以了

Scenario3 Visit Home TimeLine

Pull Mode

  • 同样的 如果采用的方式是用户从数据库里面query每个关注者的最新推特,然后把它们merge到一起,比较费时间,可以采用的方式也是采用缓存

Push Mode

  • 每个被关注的大V每次发布新推特的时候 把它写入到Cache里面每个粉丝follower的hometimeline里面 在图表里就是Fan out on Write
  • 然后某个小粉丝读取的时候 直接读取Cache里面自己的hometimeline就可以了

上面对应了两种方式Pull Mode和Push Mode
分析一下利弊

注:Push Mode的劣势

1.每个用户发布新推特时候,写延迟更高

  • 但是可以采用Async tasks异步的方式 写入每个小粉丝的home timeline
  • 虽然这样会导致不同小粉丝的hometimeline 读取到更新推特的时间不一致 但是这个Eventual Consistency是可以接受的
  1. 如果是那种百万粉的大v,那么在发布新推特的时候 要写入百万个小粉丝的hometimeline 而且有一些粉丝可能还是僵尸粉以及不活跃的用户 那其实很耗费资源
  • 可以采用下面这个Pull Mode和Push Mode结合的方式

Pull Mode & Push Mode(Hybrid Solution)

  • 对于一定数量以下的用户 (小V),采用Push Mode没问题

  • 对于一定数量以上的用户(大V), 他在发布推特的时候 不会把自己的最新推特写入到缓存里面每个粉丝的timeline中,它们的小粉丝在读取自己的timeline的时候,会先从缓存里面把已有的homeline读取出来,然后如果它的关注列表里面有大V,就会采用Pull Mode的方式,去数据库里面query这个大V的最新twitter.

05. Low Level Design

06. Scalability

着重介绍分表(Sharding) 和缓存(Caching)

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

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

相关文章

特征工程(六)—(1)利用PCA进行特征转换

(1)鸢尾花数据集的手动处理 PCA利用了协方差矩阵的特征值分解 过程如下: (1)创建数据集的协方差矩阵 (2)计算协方差矩阵的特征值 (3)保留前K个特征值(按照特征值降序排列) (4)要保留的特征向量转换新的数据点 1、加载鸢尾花数据集 import matplotlib as mpl # 解…

js实现瀑布流

我们浏览网站的时候尤其是图片网站,我们会发现大大小小的图片,紧密的排列在一起,就像瀑布一样看着非常舒服,虽然css可以通过cloums来指定, 像我们这次的图片项目用的就是css实现的,最后布局是用grid布局写的…

【Spring(一)】如何获取对象(Bean)

目录 一、前言 二、Spring的下载 三、快速入门 四、IOC(控制反转) 五、创建XML配置文件 六、获取Bean   1. 按类型来获取Bean   2. 按id来获取Bean   3. 按idclass来获取Bean   4. 默认的一种特殊方式获取Bean   5. 有关id的一些说明 相关文章 Serv…

cpu设计和实现(流水线上的第一条指令)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 读书的时候,《计算机组成原理》也看了,《计算机体系结构》也学了,老师也给我们讲了各种各样的流水线知识&#…

Spring框架笔记

Spring51. 什么是Spring框架1.1 spring的特点2. IOC2.1 什么是IOC2.2. 基于xml的IOC2.2.1 创建对象2.2.2 给创建的对象赋值2.2.2.1 使用setter方法注入2.2.2.2 使用构造方法注入2.3 基于注解IOC2.3.1 创建对象的注解2.3.2 依赖注入的注解2.3.3 添加包扫描2.3.3.1 添加包扫描多种…

小目标检测:基于切图检测的yolov5小目标训练

目前在目标检测方面有着众多的检测框架,比如两阶段的FasterRcnn、以及yolo系列的众多模型。yolo系列在实际中用的最多,一方面性能确实不错,另一方面具有着较多的改进型系列。今天我们主要使用的yolov5系列。具体原理过程就不多说了&#xff0…

数字化助力生产制造管理:家具行业管理系统

中国家具产业经过近 40 年的发展,占到世界家具生产 1 /4 强,是全球生产和出口第一大国,在世界上有着广泛的影响和关注。中国家具产业也是国民经济的重要支柱产业,2018 年总产值达到16 000 亿元,占中国 GDP 2%多。 然而…

数据库高级 IV

数据库高级 IV 二分查找算法 定义 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列前提要求:1. 线性表必须采用顺序存…

[附源码]计算机毕业设计JAVA火车票预订系统2022

[附源码]计算机毕业设计JAVA火车票预订系统2022 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybat…

[附源码]SSM计算机毕业设计智能超市导购系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

STM32所有系列keil 开发包的下载链接 - Keil.STM32Fxxx_DFP.x.x.x.pack

文章目录1、官网下载链接及操作步骤2、关于Keil官网下载芯片包的网速很慢的解决办法1、官网下载链接及操作步骤 安装Keil之后,需要安装芯片包,但是在软件上面点击下载安装,会非常慢。还不如自己到官网下载的快。 官网下载地址:…

longjmp导致局部变量丢失

0 总结 longjmp与setjmp语句之间的变量赋值会丢失。变量须满足&#xff1a; 在调用setjmp函数中的局部变量&#xff08;栈变量&#xff09; &#xff0c;全局变量不受影响非volatile 解决方法&#xff1a;加volatile 1 问题复现 #include <setjmp.h> #include <s…

H5的基础

网页的学名称作HTML文件&#xff0c;是一种可以在www网上传输&#xff0c;并被浏览器认识和翻译成页面显示出来的文件。 HTML是&#xff1a;Hypertext Marked Language即超文本标记语言&#xff0c;是一种用来制作超文本文档的简单标记语言 超文本就是指页面内可以包含图片&…

六十分之九十——沉迷期的突破

目录一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.8本技术管理书籍阅读(使用番茄、快速阅读、最后输出思维导图)2.得到"逻辑思维"、吴军硅谷来信…

WebRTC GCC 拥塞控制算法(REMB-GCC)

目录 一. 前言 二. REMB-GCC算法原理 1. 接收端基于延时梯度的带宽预估 &#xff08;1&#xff09;Arrival-time filter &#xff08;2&#xff09;Overuse Detector &#xff08;3&#xff09;Adaptive threshold &#xff08;4&#xff09;Remote Rate Controller &a…

【SQL】之索引

【SQL】之索引简单的索引设计方式innodb中的索引设计方式迭代一次迭代两次迭代三次btree聚簇索引二级索引&#xff08;非聚簇&#xff09;联合索引&#xff08;非聚簇&#xff09;InnoDB的B树索引的注意事项myISAM中索引设计方案索引是帮助mysql高效获取数据的数据结构简单的索…

查询

一、顺序查询 普通查找方式&#xff1a; int SeqSearch(int a[],int n,int k) {int i 0;while (i < n && a[i] ! k)i;if (i > n)return 0;elsereturn i 1; } 优化版查找方式&#xff1a; int OPSeqSearch(int a[], int n, int k) {int i 0;a[n] k;while …

全志A33使用主线U-Boot方法

最近在研究A33主线相关的资源&#xff0c;目前主线uboot和内核都对A33有极好的支持了&#xff0c;所以现在把我在使用过程中遇到的问题和使用方法做个记录&#xff0c;首先是下载主线uboot源码&#xff0c;网址为https://ftp.denx.de/pub/u-boot/&#xff0c;我下载的版本为202…

点云 ICP学习-IterativeClosestPoint

目录 一、pcl中 点云配准算法 二、关于svd原理求解部分 三、pcl IterativeClosestPoint 完成demo 一、pcl中 点云配准算法 PCL 库中 ICP 的接口及其变种&#xff1a; 点到点&#xff1a;pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar >点到面&…

RocketMQ——Mac电脑OS系统docker安装Dashboard

文章目录引言安装下载dashboard镜像docker pull镜像查看镜像运行容器启动容器查看容器日志问题解决方案解决方案说明登录dashboard界面关注微信公众号&#xff1a;CodingTechWork&#xff0c;一起学习进步。引言 前面的文章已经介绍过如何在OS系统上安装并启动使用RocketMQ&…