Instagram的技术探索2(转)

原文:http://www.cnblogs.com/xiekeli/archive/2012/05/28/2520770.html

前一篇翻译了Instagram blog上的一篇文章《What Powers Instagram: Hundreds of Instances, Dozens of Technologies》,让我们对Instagram 的大致技术路线有了一个大体的了解。我觉得Instagram 的工程师能够在Instagram blog上将自己使用的技术和工具进行分享,真是难能可贵。同时,在网上看到了一份Mike Krieger在“AirBnB Tech Talk 2012”上演讲的PPT,感觉受益匪浅,有必要整理学习。

  • 相关统计

用户规模:30+ million users in less than 2 years(不到2年时间,3000多万用户,注:在他们发布android版本后的10天已经突破4000万了)

在发布android版本的12个小时里,他们就新增了100万用户

  • 创建初期

两个联合创始人没有任何后端的实战经验(这也太…)

:)就是这两小子

注:

Mike Kriegerr:之前是一个颇为低调的工程师和用户体验设计师,他在一家名叫Meebo的创业公司工作了1年半。analytics & python @ meebo(在Meebo做分析,使用python );

Kevin Systrom: 毕业后在Google的收购部门工作了一年,今年28岁,随后去到了一家从事旅行业务的创业公司Nextstop,没有计算机学位,没有接受过正式培训, 但他下班后坚持自学编程,在这家创业公司被Facebook以人才收购的方式收购后,Systrom又去早期的Twitter实习了一段时间。

最初存储采用CouchDB(Apache CouchDB 是一个面向文档的数据库管理系统)

最初只有一台服务器(在洛杉矶),比一台比MacBook Pro强不到哪里去。

上线第一天有25000注册用户。

上线初期的问题(总是些微不足道的问题):

1、favicon.ico :因为忘记favicon.ico图标文件,在Django上引起大量404错误;

2、ulimit -n ,设置Linux内核可以同时打开的文件描述符的最大值,例如size为4092。

3、memcached -t 4,设置用于处理请求的线程数.

4、prefork/postfork 线程的预加载还是后加载问题,类似于线程池吧?

  • 技术迁徙

let’s move to EC2,系统扩展就像对100码速度行驶的汽车更换所有部件;

     

  • Instagram 的哲学

保持简单 
为了最小的运营负担而优化程序 
利用一切能用到的工具

  • 一、数据库扩展

早期使用django ORM+postgresql,因为PostGIS,选择了postgresql。(PostGIS在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力,相当于Oracle的spatial部分)并且数据库部署在独立服务器上。

因为EC2机器的最大内存为68G,随着照片存储量的增加,进行垂直分区(vertical partitioning);

使用django db routers,做垂直分区变得很容易;如下:照片则映射到photodb

def db_for_read(self, model):  if app_label == ‘photos‘:    return ‘photodb‘

当照片存储量大于60G的时候,采用水平分区(也就是所谓的“分片”sharding)

sharding带来的问题:

1、数据的检索,hard to know what your primary access patterns will be w/out any usage in most cases, user ID

2、当有分片变得太大的时候怎么办?

基于范围的分片策略(就像MongoDB那样)

          

3、性能有下降趋势,尤其在EC2上,原因:disk IO,解决方法:预先切分(pre-split),即预先切分上千个逻辑切片,将它们映射到较少的物理分区节点中去。

关于相关内容,更详细的可以参看这里

  • 二、选择合适工具

进行缓存/反规范化数据设计

用户上传图片时:

1、用户上传带有标题信息和地理位置信息(可选)的照片;

2、同步写到这个用户对应的数据库(分片)中;

3、进行队列化处理

a、如果带有地理位置信息,通过异步的POST请求,将这个图片的信息送到Solr(Instagram 用于geo-search API的全文检索服务器)。

b、跟随者的信息分发(follower delivery),即告诉我的follower ,我发布了新的照片。如何来实现的呢?每个用户都有一个follower 列表,新照片上传时会把照片ID发送给列表中的每一个用户,用Redis 来处理这一业务简直太棒了,快速插入,快速子集化(rapid subsets,什么意思?是指获取部分数据吗)

c、when time to render a feed,we take small # of IDs, go look up info in memcached(当需要生成feed的时候,我们通过ID+#的格式,直接在memcached中查找信息)

Redis适合什么样的场景:

1、数据结构相对有限;

2、对频繁GET的地方,对复杂对象进行缓存;

不要将自己绑定在非得以内存数据库为主要存储策略的方案上(don’t tie yourself to a solution where your in-memory DB is your main data store

关于Follow图谱

第一版:简单的数据库表格(source id, target id, status) 
需要来回答如下查询:我关注谁?谁关注我?我是否关注某人?某人是否关注我? 
当数据库的压力变大时,instagram开始在Redis中并发存储关注图谱,但这也带来了内容一致性(consistency)的问题。

不一致性一度带来缓存失效问题。

PostGIS结合轻量的memcached缓存,可以支撑上万的请求量。

需要注意点:

1、核心数据存储部分有一个万能的组件支撑,就像:Redis;

2、千万不要试想用两种工具去做同一个工作;

  • 三、保持敏捷

2010年: 2位工程师

2011年: 3 位工程师

2012年: 5 位工程师

制胜法宝:

1、广泛的单元测试和功能测试

2、坚持DRY(Don’t Repeat Yourself)原则

3、使用通知/信号机制实现解耦

4、我们大部分工作使用Python来完成,只有逼不得已的时候,才会用C

5、频繁的代码复查,尽量保持“智慧共享”。(frequent code reviews, pull requests to keep things in the ‘shared brain’)

6、广泛的系统监控

  • 四、往android平台扩展

12小时增加100万新用户

伟大的工具可以使读取更具扩展性,例如:redis: slaveof <host> <port>(SLAVEOF 命令用于在 Redis 运行时动态地修改复制(replication)功能的行为)

更短的迭代周期

不要重复发明轮子,例如想开发一个系统监控的守护进程,完全没有必要,HAProxy完全能胜任这一工作。

周围要有强大的技术顾问;

技术团队保持开放的氛围;

give back; e.g. node2dm(我理解的意思是:回报开源世界,例如:node2dm,一个出自instagram的node.js服务器,用来向安卓C2DM服务提交推送请求)

关注优化,如何是我们的系统速度快上一倍?

staying nimble = remind yourself of what’s important(保持敏捷 = 时刻提醒自己,什么才是你最重要的)

前所未有的时代,两个后端工程师能够支撑3000万用户规模的系统,关键字是: simplicity(简单)

cleanest solution with the fewest moving parts as possible(使用最少部件,最干净的解决方案)

don’t over-optimize or expect to know ahead of time how site will scale(不要过度的优化,除非你提前知道自己的系统将如何扩展)

don’t think “someone else will join & take care of this”

因为这个PPT本身也传承了instagram的simplicity哲学,因此很多信息只能靠猜,同时因为自己对相关技术认识还比较欠缺,无法很好的将其中的内容贯穿起来,整个内容翻译下来有点支离破碎的感觉,欢迎高手拍砖指正。

时间: 2024-10-20 20:12:45

Instagram的技术探索2(转)的相关文章

MySQL技术探索01实现SQL语法解析器

本文将介绍如何使用开源的语法和词法分析框架bison和flex来实现SQL解析器.出于技术学习的目的,本文做描述的微型SQL解析器仅能实现对微型SQL的语法解析. 1.MySQL中的SQL解析器 包括JDBC.ODBC.ADO等等关系数据库客户端应用开发框架在内的各种SDK,核心功能是帮助程序员简化各种客户端的数据库操作,同时将SQL语句通过网络形式发送给MySQL等关系数据库的服务器进程.MySQL服务器进行负责解析并执行这些SQL语句.SQL语句中的语法规则多种多样,MySQL服务器是如何实

基于Pytorch框架实现ENAS算法优化的图像识别技术探索-α迭代随笔

设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们希望通过将ENAS的网络架构优化算法转变为实例化项目,能够在有一定实际意义下解决对于Pytorch图像识别的探索问题. 项目性质为科研项目,由于是依托算法研究产生产品,故对于产品本身性质并不明确,通过与老师交流后初步定义为基于微信前端与后台学习框架交互的识别平台,主要以微信小程序的交互形式开放给用户. 对于典型用户,实质为使用微信且对于某些特定物品有识别需求的人.而对于典型场景来说,目标是达

iOS 热更新技术探索

最近在找工作,所以有时间研究一些BAT用到的一些框架和技术,今天要写的是热更新. 1.什么是热更新. 受限于iOS平台需要先审核在上线,一旦线上发现bug,想要修复还需要等到下次版本提交,这无形中会带给我们一些困扰,尤其是一些BAT量APP,所以热更新技术应运而生. 2.热更新解决方案. 我目前知道的有两种 第一种:微信使用的JSPatch JSPatch看名字就知道它是通过JS来实现的,大致原理就是通过下发JS脚本,通过消息转发调一些OC原生的方法,这个框架主要是用到一些JS高阶和运行时结合消

数据挖掘与机器学习技术探索培训

五.培训内容 时间 培训大纲 内容 第一天上午 第一章 机器学习及数据挖掘 基础原理 1) 什么是机器学习? 2) 什么是数据挖掘? 3) 什么是大数据? 4) 典型应用 5) 机器学习基本思想与原理 a) 假设空间 b) 主要流派 (机械学习/示教学习/类别学习/归纳学习) c) 归纳学习(有监督的学习/无监督的学习) 6) 机器学习应用的一般流程 (收集数据/准备数据/分析数据/训练/测试/应用) 7) 大数据下机器学习算法的特点 8)基础知识 a) 常见文本处理流程 (分词.词性标注.实体

Quora的技术探索(转)

原文:http://www.cnblogs.com/xiekeli/archive/2012/04/27/2473808.html 关于问答类的应用,最早接触的是stackoverflow和知乎 ,而Quora作为知乎的原型,因为其创始人来自FaceBook而吸引了我.事实上关于Quora的技术分析,冯大辉和陈皓都已经有所详细的阐述:<Quora 用了哪些技术 ?><Quora使用到的技术>.通过他们的文章,我看到了一篇更详细的说明<Quora’s Technology Ex

从华为28年坚持技术探索,看Mate 8如何卡位高端

从2014年下半年开始,中国智能手机厂商开始迈入白热化竞争阶段.一些手机厂商开始尝试高端路线,另外一些手机厂商则开始试水海外战略.不过,这些试图通过抬高售价定位高端,或者冒然进军海外的手机品牌中,除了华为.三星和苹果成功地卡位高端市场,其他的大部分手机厂商均在高端市场折戟沉沙. 华为.苹果和三星能卡位高端市场有多重因素.三星和苹果作为跨国公司本身就具有高端优势,华为从千元机林立的市场杀入中高端领域的做法,则更能代表中国手机的高端崛起之路.华为去年推出的Mate 7和今年推出的Mate 8,更是使

Quora的技术探索

关于问答类的应用,最早接触的是stackoverflow和知乎 ,而Quora作为知乎的原型,因为其创始人来自FaceBook而吸引了我.事实上关于Quora的技术分析,冯大辉和陈皓都已经有所详细的阐述:<Quora 用了哪些技术 ?><Quora使用到的技术>.通过他们的文章,我看到了一篇更详细的说明<Quora's Technology Examined>.看完以后感觉有很多东西值得深入的去学习和整理.于是决定将这篇文章先翻译出来,作为后面web学习的引子吧.下面开

数据库压缩技术探索

作为数据库,在系统资源(CPU.内存.SSD.磁盘等)一定的前提下,我们希望: 存储的数据更多:采用压缩,这个世界上有各种各样的压缩算法: 访问的速度更快:更快的压缩(写)/解压(读)算法.更大的缓存. 几乎所有压缩算法都严重依赖上下文: 位置相邻的数据,一般情况下相关性更高,内在冗余度更大: 上下文越大,压缩率的上限越大(有极限值). 块压缩 传统数据库中的块压缩技术 对于普通的以数据块/文件为单位的压缩,传统的(流式)数据压缩算法工作得不错,时间长了,大家也都习惯了这种数据压缩的模式.基于这

搜索广告与广告网络Demand技术-探索与利用

探索与利用(Explore and exploit) 点击率预测中还有一个重要的问题,就是探索与利用,它在工程中解决的并不好,我这章把现在论文中的常见的几种方法介绍一下.探索与利用它是所有互联网应用都要面对的一个问题,形式化一些,可以解释为:整体的效果是无法通过采样得到的,因为观察到的数据只是投放过的广告,而很多还没有投放的广告,想得到它们的效果,就很困难. 计算广告领域的探索与利用要解决的问题是:因为长尾(a,u,c)组合极大部分在系统中并没有出现过,所以没有这些长尾(a,u,c)的统计量,所