哈嘍大家好,我是咸魚
想必大家都聽說過 Instagram ,它是全球最受歡迎的社交媒體平臺之一,擁有數十億的活躍用戶
Instagram 誕生于 2010 年,上線一周就坐擁 10 萬注冊用戶,一年之內就擁有了 1400 萬用戶,可見擴張趨勢突飛猛進。
Instagram 誕生的時候只有 3 個工程師,想必大家對【他們怎么設計后端架構,使用了什么技術來支持這么多用戶】很感興趣吧
那么今天我們就來了解一下 Instagram 是如何在只有 3 名工程師的情況下擴展到 1400 萬用戶
原文:https://engineercodex.substack.com/p/how-instagram-scaled-to-14-million
圖片
從 2010 年 10 月到 2011 年 12 月,Instagram 的用戶在一年多的時間里從 0 增加到1400萬,關鍵是他們只有 3 個工程師
這聽起來是不是很不可思議。據 Instagram 工程師透露,他們通過遵循下面 3 個關鍵原則并擁有可靠的技術棧來做到這一點:
Instagram 早期的基礎設施運行在 AWS 上,使用 EC2 和 Ubuntu Linux
EC2 是 Amazon 的云服務,它允許開發人員租用虛擬機
Instagram 最初在 2010 年作為 iOS 應用程序推出。由于 Swift 在 2014 年才發布,那 Instagram 應該是使用 Objective-C 和 UIKit 等其他語言的組合來編寫的
Instagram 使用了 Amazon 的 Elastic 負載均衡器(Load Balancer)。他們有 3 個 Nginx 實例,Nginx 之間會進行健康檢查以此保證服務高可用
當用戶請求到來時,每個請求會先經過負載均衡器,然后才被轉發到后端實際服務器
圖片
圖片
Instagram 的應用程序服務器使用了 Django 框架,它是由 Python 編寫的,而 Gunicorn 是它們的 WSGI 服務器
WSGI (Web Server Gateway Interface)全稱 web 服務器網關接口,它會將請求從 web 服務器轉發到 web 應用程序
在批量管理和自動運維方面,Instagram 通過 Fabric 同時在多個實例上面并行運行命令,做到幾秒鐘內部署代碼
Fabric 是 Python 的一個模塊,基于 SSH 提供了豐富的交互接口,可以用來在本地或遠程機器上自動化的執行 Shel l命令,非常適合用來做應用的遠程部署及系統維護
這些實例在超過25臺 Amazon High-CPU Extra-Large 機器上運行。由于服務器本身是無狀態的,如果需要處理更多請求時,便可以添加更多的機器
Instagram 使用了 PostgreSQL 來存儲數據,應用程序服務器將從 PostgreSQL 中提取數據,PostgreSQL 存儲了 Instagram 的大部分數據,例如用戶和照片元數據
PostgreSQL 和 Django 之間的連接通過 pgbouncer
pgbouncer 是一個 PostgreSQL 連接池
任何目標應用程序都可以像連接 PostgreSQL 服務器一樣連接到 pgbouncer,并且 pgbouncer 將創建到實際服務器的連接,或者重用其現有的連接
Instagram 對用戶的數據進行了分片,即使用代碼將幾千個“邏輯”碎片映射到幾個物理碎片,因為收到的數據量很大(每秒超過 25 張照片和 90 個贊)
但是在將數據寫入這組服務器之前,Instagram 必須解決如何為數據庫中的每條數據分配ID(唯一標識符)的問題
下面則是 Instagram 中每條數據 ID 包含的內容:
Instagram 的數據分片和 ID 具體是怎么解決的小伙伴們可以看這篇文章:
https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c
對于用戶的照片,Instagram 使用 Amazon S3 來存儲,并且使用 Amazon CloudFront 把照片快速提供給用戶
Instagram 使用 Redis 將大約 3 億張照片映射到創建它們的用戶 ID 進行存儲,所有 Redis 都存儲在內存中以減少延遲,并在多臺機器上進行分片。
通過一些巧妙的散列,Instagram 能夠在不到 5 GB 的內存中存儲 3 億個鍵映射
對于常規緩存,Instagram 使用了 Memcached。他們當時有 6 個 Memcached 實例。Memcached 相對容易疊加在 Django 上
圖片
PostgreSQL 和 Redis 都使用了主從架構,并使用 Amazon EBS(彈性塊存儲)快照對系統進行頻繁備份
Instagram 使用 pyapns 來實現,Pyapns 是一個開源的、通用的蘋果推送通知服務(APNS)提供商
在后端,任務被推送到 Gearman,這是一個任務隊列,將工作分配給更適合的機器。Instagram 有 大約 200 名 Python 工作者使用 Gearman 任務隊列
Gearman 常用于多個異步任務,例如向用戶的所有關注者推送活動(發布的新照片)
Instagram 使用開源 Django 應用程序 Sentry 來實時監控 Python 錯誤
Munin 用于繪制系統范圍的指標并發出異常警報。Instagram 有一堆自定義的 Munin 插件來跟蹤應用程序級別的指標,例如每秒發布的照片
Pingdom 用于外部服務監控,PagerDuty 用于處理事件和通知
本文鏈接:http://www.www897cc.com/showinfo-26-17412-0.htmlInstagram 早期技術架構,你了解了嗎?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 阿里Java面試官:CopyOnWriteArrayList底層是怎么保證線程安全的?
下一篇: Jenkins原理篇——成員權限管理