耗時(shí)一年用戶從 0 增長(zhǎng)至 1400 萬(wàn),背后僅三名工程師,這家社交巨頭背后的技術(shù)棧是如何搭建的?
發(fā)布時(shí)間:2023-09-21 15:29:06
值得注意的是,這個(gè)曾經(jīng)估值近千億美元的 Instagram 在技術(shù)運(yùn)作上一直遵循著三個(gè)指導(dǎo)原則:讓事情變得更簡(jiǎn)單、絕不重新發(fā)明輪子、盡可能使用經(jīng)過(guò)驗(yàn)證的可靠技術(shù)。
在當(dāng)今這個(gè)各領(lǐng)域巨頭們都在過(guò)度堆砌豪華技術(shù)棧以求建立技術(shù)霸權(quán)的時(shí)代,Instagram 的成功也不禁讓人思考,是否最終 99%的公司都可以使用由三、四個(gè)人管理的經(jīng)典 LAMPish 堆棧?
Instagram 發(fā)展史
2009 年,27 歲剛剛從斯坦福大學(xué)畢業(yè)的 Kevin Systrom 任職于 Nextstop——一家旅行推薦初創(chuàng)公司。Systrom 之前曾在谷歌擔(dān)任過(guò)企業(yè)開(kāi)發(fā)助理,并在 Odeo 公司實(shí)習(xí)(該公司后來(lái)發(fā)展成了 Twitter,也就是如今的 X)。
雖然 Systrom 并沒(méi)有接受過(guò)計(jì)算機(jī)科學(xué)方面的正式訓(xùn)練,但還是憑借著才智和毅力在 Nextstop 任職時(shí)利用業(yè)余時(shí)間學(xué)會(huì)了編程。他最終開(kāi)發(fā)出一款名叫 Burbn 的 Web 應(yīng)用原型,其設(shè)計(jì)靈感來(lái)自他個(gè)人對(duì)威士忌和波本酒的深深喜愛(ài)。Burbn 應(yīng)用允許用戶簽到、發(fā)布邀約和分享照片。盡管當(dāng)時(shí)基于位置的簽到類應(yīng)用非常流行,但 Burbn 的照片共享功能仍在同類市場(chǎng)中顯得獨(dú)樹(shù)一幟。
2010 年 3 月,關(guān)鍵的轉(zhuǎn)折點(diǎn)不期而至。當(dāng)時(shí) Systrom 參加了硅谷初創(chuàng)公司 Hunch 的一場(chǎng)聚會(huì),并在會(huì)上遇見(jiàn)了來(lái)自 Baseline Ventures 和 Andreessen Horowitz 的兩位風(fēng)險(xiǎn)投資家。在向他們展示了 Burbn 應(yīng)用的原型之后,大家決定有機(jī)會(huì)喝杯咖啡再做進(jìn)一步討論。首次會(huì)面之后,Systrom 決定辭掉工作、專心打磨 Burbn。短短兩周之內(nèi),他就從 Baseline Ventures 和 Andreessen Horowitz 籌集到 50 萬(wàn)美元的種子資金,用以進(jìn)一步拓展自己的創(chuàng)業(yè)公司。
有了種子資金的加持,Systrom 得以組建一支維系業(yè)務(wù)運(yùn)轉(zhuǎn)的團(tuán)隊(duì):第一位加入的成員是 25 歲的 Mike Krieger。Krieger 同樣來(lái)自斯坦福大學(xué),此前曾在社交媒體平臺(tái) Meebo 擔(dān)任工程師兼用戶體驗(yàn)設(shè)計(jì)師,而且兩人在校期間就認(rèn)識(shí)對(duì)方。
在 Krieger 加入之后,二人重新評(píng)估了 Burbn 的業(yè)務(wù)空間,并決定將注意力集中在單一核心之上:分享由移動(dòng)設(shè)備拍攝的照片。他們仔細(xì)研究了當(dāng)時(shí)攝影領(lǐng)域的其他領(lǐng)先應(yīng)用。在他們二人看來(lái),Hipstamatic 應(yīng)用的表現(xiàn)最出色,當(dāng)時(shí)也頗受市場(chǎng)歡迎。其最大亮點(diǎn)就是提供豐富的功能選項(xiàng),比如照片濾鏡。然而,由于該軟件缺乏社交媒體分享功能,Systrom 和 Krieger 從 Hipstamatic 和 Facebook 等社交平臺(tái)的夾縫當(dāng)中看到了巨大潛力。
于是他們退后一步,將 Burbn 精簡(jiǎn)成了照片加評(píng)論加“點(diǎn)贊”的功能綜合體。以此為基礎(chǔ),他們將應(yīng)用重新命名為 Instagram,結(jié)合的是 Instant(即時(shí))與 telegram(電報(bào))兩個(gè)單詞。他們還專注于改善照片共享體驗(yàn),想要把 Instagram 打造成一款極簡(jiǎn)化、盡可能減少用戶操作需求的產(chǎn)品。經(jīng)過(guò)八周的應(yīng)用調(diào)整之后,他們帶著 beta 版本給朋友們體驗(yàn),嘗試進(jìn)行初步性能評(píng)估。在解決了軟件中的一些錯(cuò)誤之后,Instagram 首度與全世界用戶見(jiàn)面。
2010 年 10 月 6 日 Instagram 的 iOS 版本正式亮相,并在一天之內(nèi)就吸引到 2.5 萬(wàn)名用戶。在第一周結(jié)束時(shí),Instagram 的下載量已達(dá) 10 萬(wàn)次。到 12 月中旬,其用戶數(shù)量達(dá)到 100 萬(wàn)。必須承認(rèn),Instagram 的成功有著很強(qiáng)的運(yùn)氣因素,因?yàn)榫驮趲讉€(gè)月前(2010 年 6 月)搭載更強(qiáng)攝像頭的 iPhone 4 剛剛驚艷出爐。
隨著 Instagram 用戶基礎(chǔ)的迅速擴(kuò)張,更多投資者對(duì)這家年輕的公司表現(xiàn)出興趣。2011 年 2 月,Instagram 在 A 輪融資中籌得 700 萬(wàn)美元。作為其投資方之一,Benchmark Capital 為 Instagram 開(kāi)出了 2500 萬(wàn)美元的市場(chǎng)估值。除了機(jī)構(gòu)投資者之外,Instagram 還吸引到社交媒體技術(shù)行業(yè)眾多領(lǐng)先廠商的關(guān)注,其中就包括 Twitter 和 Facebook。
盡管新一輪融資讓 Systrom 和 Krieger 擁有了擴(kuò)大人員規(guī)模的底氣,但兩位創(chuàng)始人還是決定控制自身體量,將班底繼續(xù)保持在十幾人的水平。
Systrom 在 Odeo 實(shí)習(xí)時(shí)結(jié)識(shí)了 Twitter 聯(lián)合創(chuàng)始人 Jack Dorsey。Dorsey 也對(duì) Instagram 表現(xiàn)出深厚的興趣,并提出出手收購(gòu)的想法。據(jù)報(bào)道,Twitter 最終提出了價(jià)值約 5 億平均的股票收購(gòu)方案,但被 Systrom 予以回絕。
用戶從 0 增長(zhǎng)到 1400 萬(wàn),背后僅靠 3 名工程師支撐
從 2010 年 10 月到 2011 年 12 月,Instagram 在短短一年多時(shí)間里將用戶數(shù)量從 0 擴(kuò)展至 1400 萬(wàn)。而這一切的實(shí)現(xiàn),背后僅有 3 名工程師的參與。
這個(gè)驚人目標(biāo)源自三大基本原則,外加穩(wěn)定可靠的技術(shù)棧,以下是 Instagram 的指導(dǎo)原則與技術(shù)棧構(gòu)成分析。
一直以來(lái),Instagram 的技術(shù)運(yùn)作都遵循著三個(gè)指導(dǎo)原則:
讓事情變得更簡(jiǎn)單。
絕不重新發(fā)明輪子。
盡可能使用經(jīng)過(guò)驗(yàn)證的可靠技術(shù)。
簡(jiǎn)要介紹技術(shù)棧
Instagram 的早期基礎(chǔ)設(shè)施運(yùn)行在 AWS 之上,使用 EC2 配合 Ubuntu Linux,EC2 是亞馬遜提供的服務(wù),允許開(kāi)發(fā)人員租用虛擬計(jì)算機(jī)承載自家工作負(fù)載。
為了保證一切盡可能簡(jiǎn)單,這里用純粹的工程師思維展開(kāi)討論,延著用戶會(huì)話的生命周期捋順整個(gè)流程:
前端
會(huì)話:用戶打開(kāi) Instagram 應(yīng)用。
Instagram 最初于 2010 年發(fā)布 iOS 版應(yīng)用。由于 Swift 語(yǔ)言要到 2014 年才亮相,所以合理的猜測(cè)是 Instagram 是使用 Objective-C 和 UIKit 等方案組合編寫而成。
負(fù)載均衡
會(huì)話:在應(yīng)用開(kāi)啟之后,向后端發(fā)送一條獲取主提要圖像的請(qǐng)求,此請(qǐng)求隨后抵達(dá) Instagram 負(fù)載均衡器。
Instagram 采用亞馬遜的 Elastic Load Balancer 服務(wù)。工程師們租用了 3 個(gè) NGINX 實(shí)例,并根據(jù)其運(yùn)行情況來(lái)決定何時(shí)切入和切出。
每條請(qǐng)求會(huì)首先抵達(dá)負(fù)載均衡器,而后再被路由至實(shí)際應(yīng)用服務(wù)器。
后端
會(huì)話:負(fù)載均衡器將請(qǐng)求發(fā)送至應(yīng)用服務(wù)器,而應(yīng)用服務(wù)器負(fù)責(zé)保存正確處理請(qǐng)求所必需的邏輯。
Instagram 的應(yīng)用服務(wù)器使用 Django、由 Python 編寫,并選擇 Gunicorn 作為其 WSGI 服務(wù)器。
這里解釋一下,WSGI(Web 服務(wù)器網(wǎng)關(guān)接口)負(fù)責(zé)將請(qǐng)求從 Web 服務(wù)器轉(zhuǎn)發(fā)至 Web 應(yīng)用程序。
Instagram 使用 Fabric 同時(shí)在多個(gè)實(shí)例上并行運(yùn)行命令,從而在幾秒鐘之內(nèi)完成代碼部署。
這一切共同運(yùn)行在 25 臺(tái)以上的亞馬遜 High-CPU Extra-Large 超大設(shè)備之上。由于服務(wù)器本身保持無(wú)狀態(tài),所以在需要處理更多請(qǐng)求時(shí),可以靈活添加更多計(jì)算資源。
通用數(shù)據(jù)存儲(chǔ)
會(huì)話:應(yīng)用服務(wù)器須識(shí)別出請(qǐng)求所需要的主提要數(shù)據(jù),這里猜測(cè)它需要完成以下流程:
獲取相關(guān)圖像的最新 ID;
獲取與這些 ID 相匹配的實(shí)際圖像;
為這些圖像獲取用戶數(shù)據(jù)。
數(shù)據(jù)庫(kù):Postgres
會(huì)話:應(yīng)用服務(wù)器從 Postgres 處獲取相關(guān)圖像的最新 ID。
應(yīng)用服務(wù)器將從 PostgreSQL 處提取數(shù)據(jù),PostgreSQL 存儲(chǔ)有 Instagram 的大部分?jǐn)?shù)據(jù),包括用戶和照片元數(shù)據(jù)。
Postgres 和 Django 之間的連接,由 Pgbouncer 負(fù)責(zé)匯總成池。
由于收取到的數(shù)據(jù)量很大(每秒超過(guò) 25 張圖像和 90 個(gè)贊),因此 Instagram 需要對(duì)數(shù)據(jù)進(jìn)行分片。Instagram 依靠代碼將數(shù)千個(gè)“邏輯”分片映射至數(shù)個(gè)物理分片。
Instagram 還面臨著另一個(gè)有趣挑戰(zhàn),即如何生成可以按時(shí)間排序的 ID。他們生成的可按時(shí)間排序 ID 如下所示:
用 41 位表示時(shí)間(以毫秒為單位,可在一條自定義 epoch 中表達(dá) 41 年間的所有 ID);
用 13 位表示邏輯分片 ID;
用 10 位表示自動(dòng)遞增序列,模數(shù)為 1024。這意味著我們可以每毫秒為每個(gè)分片生成 1024 個(gè) ID。
借助 Postgres 中的可按時(shí)間排序 ID,應(yīng)用服務(wù)器能夠成功接收到相關(guān)圖像的最新 ID。
圖像存儲(chǔ):S3 與 CloudFront
會(huì)話:之后,應(yīng)用服務(wù)器會(huì)獲取與各圖像 ID 相匹配的實(shí)際圖像,并通過(guò)快速 CDN 鏈接為用戶提供順暢的加載體驗(yàn)。
Amazon S3 中存儲(chǔ)有數(shù)以 TB 的圖像。這些圖像可通過(guò) Amazon CloudFront 被快速交付給用戶。
緩存:Redis 與 Memcached
會(huì)話:為了從 Postgres 處獲取用戶數(shù)據(jù),應(yīng)用服務(wù)器(Django)使用 Redis 將圖像 ID 與用戶 ID 進(jìn)行匹配。
在 Redis 的支持下,Instagram 能夠?yàn)榧s 3 億張圖像存儲(chǔ)建立起指向創(chuàng)建者用戶 ID 的映射,借此引導(dǎo)在獲取主提要、活動(dòng)提要等圖像時(shí)具體應(yīng)查詢哪個(gè)分片。所有 Redis 都存儲(chǔ)在內(nèi)存內(nèi)以降低延遲,并將數(shù)據(jù)分片至多臺(tái)機(jī)器之上。
通過(guò)一系列巧妙的哈希處理,Instagram 得以在不到 5 GB 空間內(nèi)存儲(chǔ)這 3 億個(gè)鍵映射。
由此建立的圖像 ID 與用戶 ID 的鍵值映射,用于指示具體應(yīng)查詢哪個(gè) Postgres 分片。
會(huì)話:借助 Memcached 的高效緩存(最近響應(yīng)均被納入緩存),從 Postgres 處獲取用戶數(shù)據(jù)的速度很快。
對(duì)于常規(guī)緩存,Instagram 使用 Memcached。當(dāng)時(shí) Instagram 設(shè)置了 6 個(gè) Memcached 實(shí)例,可以在 Django 上以相對(duì)簡(jiǎn)單的方式進(jìn)行分層。
有趣的事實(shí):兩年之后的 2013 年,F(xiàn)acebook 發(fā)布了一篇具有里程碑意義的論文,介紹了他們?nèi)绾螖U(kuò)展 Memcached 以順利實(shí)現(xiàn)每秒數(shù)十億條請(qǐng)求的處理能力。
會(huì)話:用戶現(xiàn)在可以看到主頁(yè)內(nèi)容,其中展示的就是其所關(guān)注用戶的最新圖像。
主副本設(shè)置
Postgres 和 Redis 均在主副本設(shè)置中運(yùn)行,并使用 Amazon EBS(Elasti