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