人均身价超 5 亿的 Instagram,如何用 3 个工程师支撑 1400 万用户

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

Instagram 是一款以图片和短视频分享为主的社交媒体平台,于 2010 年由 Kevin Systrom 和 Mike Krieger 创建。用户可以通过 Instagram 应用发布和编辑照片和视频,添加滤镜和标签,以及与朋友互动。以下故事发生在 Instagram 早期的快速增长阶段。

从 2010 年 10 月到 2011 年 12 月,Instagram 在短短一年多的时间里,用户数量从 0 增长到 1400 万。他们仅用 3 名工程师就做到了这一点。

他们之所以能做到这一点,是因为遵循了 3 个关键原则并拥有可靠的技术栈。

Instagram 的指导原则

  • 一切从简。
  • 不要重复发明轮子。
  • 尽可能使用经过验证的可靠技术。

早期 Instagram 的基础设施运行在 AWS 上,使用 EC2 和 Ubuntu Linux。为了方便起见,让我们通过用户会话(session) 的生命周期来描述整个技术栈。

前端

会话:用户打开 Instagram 应用程序。

Instagram 最初是在 2010 年作为 iOS 应用程序推出的。Instagram 是使用 Objective-C 以及对应的 UIKit 框架来写的。

file

负载均衡

会话:打开应用后,抓取主 feed 照片的请求会被发送到后台,在那里会碰到 Instagram 的负载均衡器。

Instagram 使用 AWS 的 Elastic Load Balancer (ELB)。他们有 3 个 NGINX 实例,这些实例会根据其是否健康进行交换。

每个请求在路由到实际应用服务器之前都会首先到达 ELB。

file

后端

会话:ELB 将请求发送到应用服务器,应用服务器拥有正确处理请求的逻辑。

Instagram 的应用服务器使用了 Django,它是用 Python 编写的,Gunicorn 是他们的 WSGI 服务器。

作为复习,WSGI(Web Server Gateway Interface,网络服务器网关接口)将请求从网络服务器转发到网络应用程序。

Instagram 使用 Fabric 同时在多个实例上并行运行命令。这样就能在几秒钟内部署代码。

这些实例运行在超过 25 台 AWS CPU High-CPU Extra-Large 的机器上。由于服务器本身是无状态的,因此当他们需要处理更多请求时,可以添加更多机器。

file

通用数据存储

会话:应用服务器收到请求,这些请求需要主 feed 上数据。

为此,它大致需要:

  1. 最新的相关照片 ID
  2. 与这些照片 ID 匹配的实际照片
  3. 这些照片的用户数据

数据库:Postgres

会话:应用服务器从 Postgres 中获取最新的相关照片 ID。

应用服务器将从 PostgreSQL 中提取数据,该数据库存储了 Instagram 的大部分数据,如用户和照片元数据。

PostgreSQL 和 Django 之间的连接使用 Pgbouncer 连接池。

由于 Instagram 接收的数据量很大(每秒超过 25 张照片和 90 个赞),他们对数据进行了分片。他们使用代码将几千个「逻辑」分片映射到几个物理分片上。

Instagram 面临并解决的一个有趣挑战是生成可按时间排序的 ID。他们生成的可按时间排序的 ID 是这样的:

  • 41 位比特表示以毫秒为单位的时间(提供 41 年的 ID 和自定义纪元)
  • 13 位比特表示逻辑分片 ID
  • 10 位比特表示自动递增序列,模数为 1024。这意味着我们可以为每个分区每毫秒生成 1024 个 ID

得益于 Postgres 中可按时间排序的 ID,应用服务器成功接收到了最新的相关照片 ID。

照片存储:S3 和 Cloudfront

会话:然后,应用服务器通过快速 CDN 链接获取与这些照片 ID 匹配的实际照片,以便快速加载给用户。

AWS S3 中存储了数 TB 的照片。这些照片通过 AWS CloudFront 快速提供给用户。

缓存:Redis 和 Memcached

会话:为了从 Postgres 中获取用户数据,应用服务器(Django)使用 Redis 将照片 ID 与用户 ID 进行匹配。

Instagram 使用 Redis 存储了约 3 亿张照片与创建这些照片的用户 ID 的映射,以便在为主 feed、活动 feed 等获取照片时知道要查询哪个分片。所有 Redis 都存储在内存中,以减少延迟,并在多台计算机上进行分片。

通过一些巧妙的哈希算法,Instagram 能够在不到 5 GB 的空间内存储 3 亿个键值的映射。

为了知道要查询哪个 Postgres 分区,需要将照片 ID 与用户 ID 进行键值映射。

会话:由于使用了 Memcached 进行高效缓存,从 Postgres 获取用户数据的速度非常快。

对于一般缓存,Instagram 使用的是 Memcached。当时他们有 6 个 Memcached 实例。将 Memcached 架设在 Django 上相对简单。

有趣的事实是:2 年后的 2013 年,Facebook 发布了一篇具有里程碑意义的论文,介绍了他们如何扩展 Memcached 以帮助他们处理每秒数十亿次的请求。

会话:用户现在能看到首页 feed 了,上面有他所关注的人的最新图片。

file

主从设置

Postgres 和 Redis 都是用主从设置,并使用亚马逊 EBS(弹性块存储)快照功能对系统进行频繁备份。

推送通知和异步任务

会话:现在,假设用户关闭了应用,但又收到推送通知说朋友发布了一张照片。

该推送通知是使用 pyapns 发送的,同时发送的还有 Instagram 已发送的十亿多条推送通知。Pyapns 是一个开源、通用的苹果推送通知服务(APNS)提供商。

会话:用户非常喜欢这张照片!所以他决定在 Twitter 上分享。

在后端,任务被推送到 Gearman,这是一个任务队列,可以将工作分派给更合适的机器。Instagram 有大约 200 个 Python Workers 在使用 Gearman 任务队列。

Gearman 用于执行多个异步任务,例如向用户的所有关注者推送活动(如发布新照片)(称为 fanout)。

file

监控

会话:啊哦!Instagram 挂了,原因是服务器出错,发送了错误的响应。

Instagram 的三名工程师立即收到了警报。

Instagram 使用开源 Django 应用程序 Sentry 实时监控 Python 错误。

Munin 被用来绘制全系统指标图,并对异常情况发出警报。Instagram 有许多自定义 Munin 插件,用于跟踪应用级指标,如每秒发布的照片。

Pingdom 用于外部服务监控,PagerDuty 用于处理事件和通知。

最终的架构概览图

file

译者后记

在之后的 2012 年,Facebook 就以 10 亿美金收购了当时只有 13 名员工的 Instagram,折算成 RMB 的话,人均身价超过 5 亿。当时 Facebook 可以说是下了血本,但现在来看,这笔收购是 Facebook 至今为止最成功的一次收购。

还是那句话,我们应该采用无聊的技术去构建创新的产品,而不是倒过来。


💡 更多资讯,请关注 Bytebase 公号:Bytebase

DDR4 硬件设计笔记 DDR4-DRAM是第四代支持双倍数据读取,支持随机位置存取的静态存储器。DDR4-DRAM的工作原理。DDR之T拓扑和Fly-by拓扑。DDR的硬件设计。DDR4 PCB设计要点介绍。DDR4之PCB走线间距的串扰评估。DDR4之内存通道(channel)和内存列(rank)。 阅读详情

相关推荐

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash。

cl234583745的博客 1466

从 0 到 1400 万用户,3 名工程师如何撑起 Instagram?

在推出短短一年的时间里,Instagram 迅速“蹿红”,它的用户数量从 0 增长到了 1400 万。Instagram 的应用服务器使用 Django 框架以及它是用 Python 编程语言编写的,并选择 Gunicorn 作为他们的 WSGI 服务器。Instagram 有很多自定义的 Munin 插件来跟踪应用级别的指标,比如每秒发布的照片数量。为了简化说明,这里从工程师的角度来看用户会话的生命周期(下文标注为“Session:”),从而捋清楚 Instagram 所用到的一些技术。

IT界那些事儿 161

三菱FX5U PLC与CCLINK模块通信配置全流程(附接线图与参数详解)

本文详细解析了三菱FX5U PLC与CCLINK模块的通信配置全流程,包括硬件接线规范、参数设置及软件编程方法。通过实战指南帮助工程师快速掌握FX5U与CCLINK模块的高效通信技术,提升工业自动化控制系统的稳定性和可靠性。

weixin_27014595的博客 435

Instagram 早期技术架构

哈喽大家好,我是咸鱼想必大家都听说过 Instagram ,它是全球最受欢迎的社交媒体平台之一,拥有数十亿的活跃用户Instagram 诞生于 2010 年,上线一周就坐拥 10 万注册用户,一年之内就拥有了 1400 万用户,可见扩张趋势突飞猛进。Instagram 诞生的时候只有 3 个工程师,想必大家对【他们怎么设计后端架构,使用了什么技术来支持这么多用户】很感兴趣吧,那么今天我们就来了解一下。

s_alted的博客 365

Kettle下载与安装教程【保姆版】

Kettle简介 Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。 它由Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。 主要功能 Pentaho D

weixin_43407520的博客 12万+

LangChain4j-针对性操作Function-call+系统预设角色

如果我们想要对一些敏感信息进行针对化的操作,不仅仅是接口大模型去进行回复。比如我们现在数据库里面有一些菜品,那么用户提问,店里有多少套餐,那么云端大模型肯定是不知道的,我们希望捕获这些关键字然后进行自己的业务查询或者处理,这个时候就可以使用function-call。

DDDDDouble的博客 454

Instagram: 用Django服务30亿用户

相关阅读:年底被裁!卸磨杀驴,程序员心中的悲愤与无奈……想从技术转管理?这些坑你可要注意了!互联网技术(java框架、分布式、集群)干货视频大全,不看后悔!(免费下载)在...

emprere的博客 857

YOLOv5源码逐行超详细注释与解读(3)——训练部分train.py

全网最详细的YOLOv5项目源码解读之训练部分train. py。全文近5万字!代码逐行注释,逐段讲解,小白入门必备!

路人贾的博客 3万+

Instagram 小而美的分片和 ID 生成解决方案

Instagram 是一款以图片和短视频分享为主的社交媒体平台,于 2010 年由 Kevin Systrom 和 Mike Krieger 创建。用户可以通过 Instagram 应用发布和编辑照片和视频,添加滤镜和标签,以及与朋友互动。上期「」介绍了 Instagram 早期的快速增长阶段遵循的原则和技术栈,本文展开讲解了他们是如何在工程师团队较小的情况下扩展业务的。为了确保这些重要的数据能迅速载入内存并快速供用户访问,我们开始将数据。

Bytebase的博客 309

我用 Python 监听了自己的键盘,生成击键热力图,看看每天到底在“摸鱼”还是“搬砖”?

数据采集(监听)、持久化(I/O)与可视化展示,必须是三个完全独立的模块,这符合单一职责原则。在多线程读写 Python 字典时,锁住的时间要尽可能短,防止 I/O 线程把高频的监听线程阻塞住。这类涉及底层的代码与“键盘记录木马”只有一线之隔。永远不要把击键记录通过网络上传,所有数据必须localhost消化。人脑对枯燥的 JSON 日志是不敏感的,但对颜色和空间极其敏感。这也是为什么 Prometheus + Grafana 是标配。使用ctypes。

BUG猿的博客 194

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

WW、forever的博客 194

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 475

Android HAL 架构详解,底层开发不再难

HAL Binder 这套机制牛在哪?性能:一次拷贝,快如闪电。规范:HIDL 让接口定义整齐划一,维护省心。兼容:版本管理做得好,新老设备都能跑。有了这套通信体系,HAL 就像打了通脉,上下贯通,硬件操作变得丝滑无比。通信机制搭好了桥,接下来 HAL 得真正把手伸到硬件上。这部分是 HAL 的 “最后一公里”,直接决定硬件能不能被用起来。HAL 的接口定义是整个体系的灵魂,它决定了上层和底层怎么 “说话”。

大模型大数据攻城狮的专栏 1674

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 431

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【基于 WebSocket 的多用户网页五子棋】—— 数据管理模块

但行好事,莫问前程

qq_42996461的博客 250

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++算法(七)

C++ stack算法题和一些客观题

2503_94479566的博客 378

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 284

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 176

TransactionInactiveError:await 之后事务已经不活跃了

TransactionInactiveError 出现于 IndexedDB 事务已结束(非 active 状态)时调用 put、get 等操作。常见于 await 后或 setTimeout 中执行请求,因任务已完成,事务已提交或进入 finished 状态。请求必须在创建事务的同一任务中挂起,否则无效。解决方法:在 onsuccess 回调内同步发起后续操作,或提前将所有请求挂入事务。避免在异步上下文中使用事务操作,确保请求在事务活跃期内完成。

qq_40822000的博客 158

云计算课程小组PPT汇报任务书

36人分为6组,每组6人;形式:生活案例调研 + 理论解读;汇报时长7‑9min;PPT建议10‑14页。

Michelle8023的博客 205

软件项目交付时,源代码之外还应该交付哪些技术资料?

软件项目交付时,除可运行程序外,还应核对源代码、数据库结构、接口文档、部署运维、测试验收和账号资产。本文从实际交付环节拆解完整资料清单,并说明合同如何约定交付范围、知识产权与维护边界。

chengduyoushu的博客 300

大表 ALTER TABLE 怎么做?NineData OnlineDDL 配置与执行实践

介绍NineData OnlineDDL大表变更实践,涵盖执行策略、切表控制、拷贝批次与可视化进度追踪。

dbasenewbie的博客 294

Axum 初步入门学习笔记

)自定义错误实现后,可以直接作为Result的ErrAxum 是一个构建在 Tokio、Tower、Hyper 之上的 Rust Web 框架,核心能力是:Router 路由、Extractor 提取器、Tower 中间件、IntoResponse 响应机制、State 共享状态。那张分层架构图是“地图”不是“说明书”:它帮你建立全局观,但 Service、Repository、数据库、Redis、MQ 都是你自己在 Handler 内部调用的业务/基础设施层,不是 Axum 自带的。

weixin_43219667的博客 173

MySQL报Too many open files?句柄耗尽的排查与参数配置

文章讲清 max_connections 与 open_files_limit 两个额度、句柄被谁占走、分区表为什么最容易踩,给出从 error log 到 /proc/pid/limits 的定位顺序与句柄预算算法。

「一个在数据库赛道上边学边分享的学妹」——聚焦国产数据库/信创方向、分享学习笔记、踩坑经验和行业观察。 335

SQL Server 数据库双备份:简化配置,兼顾本地留存与异机归档

本文针对中小企业SQLServer数据库备份难题,提出简化配置与本地+异机双副本方案。传统原生备份依赖手动脚本,存在配置复杂、传输易中断、日志分散、静默失败等问题。推荐使用图形化工具实现备份、本地留存与异机同步一体化管理,支持断点续传、加密传输、自动清理与版本控制,降低运维负担。双副本策略提升数据安全性,本地快速恢复,异地防硬件故障。建议定期验证恢复流程,确保备份可用性。

2501_93776716的博客 283

Redis 入门详解:核心特性、重要文件与全局命令实战

本文系统介绍了Redis的核心特性、重要文件及全局命令。Redis凭借内存存储、C语言实现和单线程设计,具备极高的读写性能;支持持久化(RDB/AOF)、主从复制与集群架构,适用于缓存、排行榜、计数器等场景,但不适合存储海量冷数据。文中还解析了常见面试题,如为何快速、单线程原理、持久化机制、KEYS *禁用原因及过期键处理策略,强调其在高并发场景下的优势与局限。

2303_77004089的博客 205
上一篇: 火烧眉毛,我是如何在周六删了公司的数据库
下一篇: Bytebase 2.13.1 - 支持 Apache Doris
Bytebase
博客等级 码龄5年 1349粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值