我如何使用每月100美金伺服器支撐5天內5百萬使用者

banq發表於2016-08-02
GoSnaps是目前最流行應用口袋妖怪Pokemon GO的粉絲應用,用於分享口袋妖怪的螢幕截圖和地圖圖片。GoSnap在第一天增長到6萬使用者,第二天16萬,5天后50萬獨立使用者,任何時間都有1000個併發使用者,該應用有一個自動識別軟體自動檢查上傳圖片是否和口袋妖怪有關,重新縮放圖片大小。

這是執行在Google Cloud伺服器的每月100美金配置上。而之前支援聊天的口袋妖怪粉絲應用GoChat在5天內達到一百萬使用者,結果當機了,損失了很多使用者和金錢,業內認為建立這樣一個支援一百萬使用者需要4000美金。

GoSnaps是作為一個最小可行產品MVP方式建立的,不是專業的業務產品,在24小時鼓搗出來,採取NodeJS模板專案hackathons和MongoDB資料庫,沒有任何快取,沒有Redis,沒有Varnish,沒有時髦的Nginx設定,都沒有。

實際iOS應用是使用原生Objective-c程式碼編制,借用了Unboxd的地圖相關程式碼,那麼如何使之效能擴充套件呢?不懶惰。

圖片儲存在MongoDB中,無需配置和程式碼,MVP建立很容易,那麼查詢怎麼辦?複雜的篩選查詢非常耗時,解決辦法是:將縮放圖片上傳到Google雲端儲存,這樣自己的伺服器和資料庫不會接受圖片請求,自己的資料庫只關心圖片,這就節約很多伺服器。

在資料庫這邊,分離快照到幾個不同集合:所有快照,最像快照,最新快照,最新有效快照等等,無論什麼時候一個快照加入,被標記為喜歡或討厭,程式碼檢查它是否屬於這些集合並採取相應行動,這樣程式碼能夠從事先準備的集合中查詢,而不是對資料庫執行全域性複雜查詢,這只是將資料邏輯地劃分到幾個區域,沒有複雜性了,允許單獨查詢一個排序操作的地理空間座標,也就是能夠直接查詢資料。

如果我選擇更慢程式語言或更大框架來建立GoSnaps,會花費更多伺服器,比如PHP的Symfony,Django的Python,Ruby on Rails等等,我會花很多時間解決應用緩慢問題或增加伺服器,這以前我經常做。

由於使用Mongoose 作為MongoDB的ORM,上個週末4個NodeJS程式耗費了90%CPU,意識到Mongoose抓取資料問題,啟用了"lean()"功能來獲得普通JSON物件,而不是魔術Mongoose物件,這樣改變以後,NodeJS程式的CPU佔用下降到5-10%。想象我有一個重型庫包比如帶有Doctrine的Symfony,需要很多伺服器很多CPU核執行程式碼,即使資料庫是瓶頸,而不是程式碼。

選擇一個精益和快速語言對於擴充套件性是很重要的,除非你有很多錢買伺服器。選擇一個語言是否帶有可用庫包更重要,因為這事關你是否能快速構建MVP。

NodeJS,Scala和Go都是滿足這些需求的好語言,它們都提供好的效能,PHP和Java就是不必要地慢了,但是通常用於構建大型框架和程式碼系統,用於建立乾淨物件導向開發和良好測試程式碼是很好的,但不適合快速和廉價地擴充套件。

MVP最小可行產品和擴充套件性可以共存。

How I built an app with 500,000 users in 5 days on

相關文章