从零打造 Instagram

简介: 从零打造 Instagram

Instagram 是全球最大的照片、视频分享社区,如果让我们自己设计一个 Instagram 这样的服务,应该怎么做呢?这篇文章解析了 Instagram 的功能和架构,从中我们可以看到设计一个内容分享服务所需要关注的部分。原文:Instagram System Architecture[1]


image.png


Instagram 是一个免费的照片和视频分享社交网络,有很多人每天在上面分享故事,记录生活中的点点滴滴。


功能性需求


  1. 用户可以上传照片和视频
  2. 用户可以查看照片和视频
  3. 用户可以根据照片标题进行搜索
  4. 用户可以关注/取消关注其他用户
  5. 用户可以通过搜索栏搜索用户 id
  6. 为关注的每个用户创建信息流
  7. 可以把照片存档
  8. 可以通过聊天窗口分享故事
  9. 可以拉黑/限制其他用户
  10. 可以在其他用户的帖子下面点赞和评论
  11. 用户可以发帖


image.png

非功能性需求


  1. 高可扩展性
  2. 高一致性
  3. 高可用性
  4. 高可靠性
  5. 用户数据应该是持久化的(任何上传的照片都不应该丢失)
  6. 生成信息流的最大延迟是 150 毫秒

接下来我们做一下系统容量估算


  1. 假设注册用户 = 5 亿
  2. 30%的活跃用户 = 1.5 亿
  3. 注册名人人数 = 10k
  4. 读请求数 = 100 *上传(写)请求数
  5. 高峰时刻,假设平均流量 = X,目标处理上限是 6X


活跃用户:


  1. 每周发帖 3 次,每个帖子包含 1 MB 的图片和文本
  2. 每个帖子至少收到 10 个赞和 2-3 条评论
  3. 关注 100 个用户,有 50 个粉丝
  4. 每天刷新 2 次信息流


名人:


  1. 每周发帖 2 次,每个帖子包含大于 500K 的图片和文本
  2. 每个帖子至少收到 50K 个赞和至少 1K 条评论
  3. 拥有 500 万粉丝
  4. 每天刷新 2 次信息流


每秒请求数(QPS):


  1. 发帖
  • Create_post_avg = (150 Million + 10 K) * 2 / (72460*60) = 496/s
  • Create_post_peak = 496/s*6 = 3k/s


  1. 点赞
  • like_post_avg = (150 million10 +10K50K) * 2 / (72460*60) = 6.6 k/s
  • like_post_peak = 6.6 k/s*6 = 40 k/s


  1. 评论
  • comment_post_avg = (150 million * 2 + 10K * 1K) = 1k/s
  • Comment_post_peak = 1k/s * 6 = 6k/s


  1. 关注信息流
  • get_follow_feed_avg = (150 million + 10K) * 2 / (246060) = 3.5k/s
  • get_follow_feed_peak = 3.5k/s * 6 = 21.8 k/s


  1. 数据量
  • 64base([‘a-z’,‘A-Z’,‘0–9’,‘-’,‘_’])编码的 user_id,需要 5 bits ~ 1Byte
  • 500 Million + 10K * 5 bits ~ 1 Byte = 1G user


容量估计:


  1. 每天上传的活跃用户 = 100 万
  2. 每天上传的照片 = 500 万张
  3. 每天每秒上传的照片 = 57 张照片
  4. 平均照片大小 = 150 KB
  5. 每天存储开销 = 500 万* 150KB = 716GB
  6. 数据保存 10 年,所需存储容量为 716 GB * 365 * 10 年 = 2553 TB ≈ 2.6 PB
  7. 日活跃用户查看 = 1000 万
  8. 每小时的信息流产生量为 1000 万,即 2800 RPS(每秒请求数)。
  9. 如果用户每天搜索一次,那就是每天 1000 万次搜索,也就是 115 个 RPS。

系统组件设计

  • 上传照片和视频 = 写操作
  • 查看照片和视频 = 读操作
  • 读写比 = 20:80
  • Web 服务器可以同时支持 1000 个活动连接
  • 200 个连接会被写操作占用,写入(上传)会使连接长时间保持打开状态


image.png


因此,更好的方法是用 2 个数据库分别处理读写操作。此外,分离照片的读写请求可以帮助我们独立的扩展和优化每个过程。下图显示了读写的过程。


image.png


1. 信息流生成服务(News Feed Generation services)


  • 为用户更新所关注的用户的最新帖子
  • 每个用户的信息流都是独一无二的,组合非常复杂
  • 为了生成新的信息流,系统必须获取这些照片的元数据(喜欢、评论、时间、位置等),并将其传递给排名算法,以决定哪些照片应该根据元数据安排在信息流中
  • 后端需要同时查询大量的表,然后使用预定义的参数对它们进行排序,这种方法将导致更高的延迟,需要大量的时间来生成新的信息流
  • 因此,可以采用预生成的信息流。创建专门用于生成每个用户独有信息流的服务器,并将其结果存储在单独的信息流表中。当用户点击更新时,直接从数据库中读取信息流并显示给用户。


2. 提供信息流(Serving the News Feed)


  • 推模式(Push) — 当用户上传了新的照片/视频,他/她的所有粉丝都会获得更新。如果用户关注了很多人或名人,服务器就必须非常频繁的向用户推送更新。
  • 拉模式(Pull) — 用户主动刷新他们的信息流(向服务器发出一个拉取请求)。在用户刷新之前,新帖子是不可见的。
  • 混合模式(Hybrid Approach) — 对拥有大量粉丝的名人用户应用拉模式,普通用户采用推模式。


3. 负载均衡(Load Balancing)


  • 将流量分流到一组服务器中,从而提高网站或应用程序的响应和可用性
  • 使用最小带宽法
  • 该算法将选择流量最小的服务器(以每秒兆位(Mbps)计算)提供服务
  • 部署在客户端和服务器或服务器和数据库之间

数据架构


image.png

数据库设计


1. 用户相关数据


  • User ID(主键):唯一的用户 ID,便于全局区分用户
  • Name:用户名
  • Email:用户邮件地址
  • Password:用户密码,用于用户登录
  • Create Date:用户注册时间


2. 照片相关数据(AWS S3)


  • photo id(主键):10 字节长度的唯一照片 id,用于标识每一张照片
  • UserId:上传照片的用户 id
  • Path:存放照片的对象存储路径/URL
  • Latitude & Longitude(纬度和经度):存储这些信息来找到照片的位置
  • Date & time(日期和时间):照片上传的日期和时间戳


image.png


3. 用户关注和粉丝相关数据


  • Following:该用户所关注的所有用户的 UserId
  • Followers:关注该用户的所有用户的 UserId


image.png


因此,我们需要两种不同的数据库:1)关系型数据库(MySQL)2)NoSQL 数据库(Cassandra)

数据模型

image.png

image.png


典型查询


  • 获取用户 X 关注的所有用户——为用户 X 发送信息流
  • 获取所有关注用户 X 的用户——将用户 X 的帖子推送到关注者的信息流中
  • 获取所有活跃用户(为活跃用户提供缓存的关注者信息流)

接口/API


  1. create_post(user_id, image, text, timestamp) -> success/failure
  2. comment_post(user_id, post_id, comment, timestamp) -> success/failure
  3. like_post(user_id, post_id, timestamp) -> success/failure
  4. get_follow_feed(user_id, timestamp) -> list of newest posts from user follow list, ordered by time, limit 20
  5. get_profile_feed(user_id, user2_id, timestamp) -> list of newest posts from user2, ordered by time, limit 20

系统架构


image.png


发帖


image.png


信息流


image.png

进一步细化

发帖


image.png


信息流


image.png


image.png


image.png

image.png

延伸阅读:

  1. Instagram Engineering: https://medium.com/@InstagramEng
  2. Instagram System Design: https://youtu.be/da7mdMz0g0g
  3. Designing Instagram: https://www.educative.io/courses/grokking-the-system-design-interview/m2yDVZnQ8lG
  4. Design Photo Sharing Platform - Instagram: https://techtakshila.com/system-design-interview/chapter-4/
  5. Designing Instagram: https://www.codercrunch.com/design/634265/designing-instagram
  6. Designing Instagram Architecture: https://nlogn.in/designing-instagram-architecture-system-design/
  7. System Design Analysis of Instagram: https://towardsdatascience.com/system-design-analysis-of-instagram-51cd25093971


References:

[1] Instagram System Architecture: https://medium.com/interviewnoodle/instagram-system-architecture-fdbec22e48ee

目录
相关文章
|
开发工具 git
git push报错:The current branch master has no upstream branch
git push报错:The current branch master has no upstream branch
40822 0
git push报错:The current branch master has no upstream branch
|
10月前
|
自然语言处理 数据可视化 测试技术
告别‘人海战术’!基于EvalScope 的文生图模型智能评测新方案
生成式模型在文本生成图片等领域的快速发展,为社区带来了日新月异的诸多文生图模型。
952 20
|
5月前
|
数据采集 人工智能 自然语言处理
大模型微调「数据集构建」保姆级教程(超全)
2024年是“行业大模型元年”,但超80%微调失败源于数据问题。本文揭示从数据收集、清洗到增强的全流程方法论,强调“数据优先”而非“算法崇拜”,结合实战案例与工具推荐,助你构建高质量数据集,真正释放大模型业务价值。
2624 2
大模型微调「数据集构建」保姆级教程(超全)
|
9月前
|
SQL 人工智能 数据可视化
开源AI BI可视化工具-WrenAI
Wren AI 是一款开源的 SQL AI 代理,支持数据、产品及业务团队通过聊天、直观界面和与 Excel、Google Sheets 的集成获取洞察。它结合大型语言模型(LLM)与检索增强生成(RAG)技术,助力用户高效处理复杂数据分析任务。
|
消息中间件 监控 大数据
优化Apache Kafka性能:最佳实践与调优策略
【10月更文挑战第24天】作为一名已经对Apache Kafka有所了解并有实际使用经验的开发者,我深知在大数据处理和实时数据流传输中,Kafka的重要性不言而喻。然而,在面对日益增长的数据量和业务需求时,如何保证系统的高性能和稳定性成为了摆在我们面前的一个挑战。本文将从我的个人视角出发,分享一些关于如何通过合理的配置和调优来提高Kafka性能的经验和建议。
551 4
|
前端开发 API UED
React 懒加载图片 Lazy Image
懒加载是一种优化技术,通过延迟加载不在视口内的图片,减少初始页面加载时间,提升用户体验。本文从基础概念入手,逐步探讨 React 中实现图片懒加载的常见问题、易错点及解决方案,并通过代码案例详细解释。
649 3
|
移动开发 前端开发 JavaScript
React 图片裁剪组件 Image Cropper
本文介绍了在React中实现图片裁剪功能的方法,涵盖基础知识、常见问题及解决方案。首先,通过第三方库如`react-image-crop`或`cropperjs-react`可轻松实现图片裁剪。接着,针对性能和兼容性问题,提供了优化图片加载、处理裁剪区域响应慢、解决浏览器差异等方案。最后,通过代码案例详细解释了如何创建一个基本的图片裁剪组件,并提出了优化建议,如使用`React.memo`、添加样式支持及处理大图片预览,帮助开发者避免常见错误并提升用户体验。
893 67
|
机器学习/深度学习 算法 Python
群智能算法:深入解读人工水母算法:原理、实现与应用
近年来,受自然界生物行为启发的优化算法备受关注。人工水母算法(AJSA)模拟水母在海洋中寻找食物的行为,是一种新颖的优化技术。本文详细解读其原理及实现步骤,并提供代码示例,帮助读者理解这一算法。在多模态、非线性优化问题中,AJSA表现出色,具有广泛应用前景。
|
Java Maven 开发者
Maven的依赖作用域和依赖传递
Maven的依赖作用域和依赖传递
1213 0
Maven的依赖作用域和依赖传递
|
前端开发 JavaScript 开发者
React craco 详细使用与介绍(类似 Vue 外抛的 vue.config.js)
React craco 详细使用与介绍(类似 Vue 外抛的 vue.config.js)
2875 0