我如何使用每月100美金伺服器支撐5天內5百萬使用者
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最小可行產品和擴充套件性可以共存。
這是執行在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最小可行產品和擴充套件性可以共存。
相關文章
- 支撐百萬併發的資料庫架構如何設計?資料庫架構
- 我如何轉行為程式設計師:心態支撐著我程式設計師
- Python + Django 如何支撐了 7 億月活使用者的 Instagram?PythonDjango
- 分析如何支撐高併發?
- 如何支撐微服務架構落地微服務架構
- 看SparkSql如何支撐企業數倉SparkSQL
- 如何利用資料來支撐設計?
- 支撐日活百萬使用者的高併發系統,應該如何設計其資料庫架構?【石杉的架構筆記】資料庫架構筆記
- TDengine 助力智慧燃氣,支撐數百萬智慧終端的接入管理
- 中國股市如何判斷支撐和壓力
- 百萬獎金+流量支撐,微信創意小遊戲的未來該怎麼走遊戲
- 支撐主業 內部環境與幾大平臺建設
- 安全攻略:三大技術支撐安全內容(轉)
- 谷歌2億2千5百萬使用者ID遭曝光谷歌
- 『特斯拉使用者很有錢 支撐得起高階內容付費市場』今日資料行業日報(2017.7.3)行業
- 微信內建H5支付H5
- 利聯科技:無錫BGP伺服器網路穩定的支撐點伺服器
- 使用HAProxy、PHP、Redis和MySQL支撐每週10億請求PHPRedisMySql
- 企業日常管理活動支撐平臺
- [AIAgent]白菜GPT支撐AutoGen開發示例AIGPT
- 支撐無伺服器計算,傳統儲存方案已經行不通了伺服器
- .NET技術+25臺伺服器怎樣支撐世界第54大網站伺服器網站
- 中興伺服器R5300 G5算力強勁,有力支撐企業數字化轉型伺服器
- 企業移動APP開發方案:支撐電商APP系統高併發,保障使用者資料安全APP
- 歐洲伽利略導航系統遭遇大規模故障 使用者尋求美國 GPS 等後備支撐
- 那些年,支撐尾款人們熬夜的AIAI
- 統計學習方法(四) 支撐向量機
- MySQL 資料庫 到底能支撐多少表?MySql資料庫
- 學習型組織的資訊化支撐
- 支撐程式設計師的三種精神程式設計師
- 培訓,就業最有力的支撐 (轉)就業
- 對話秦延濤:中興GoldenDB如何支撐金融機構分散式改造?Go分散式
- 如何設計一個百萬級使用者的抽獎系統?
- 如何擴充套件一個網站以支援數百萬使用者?套件網站
- 醫院怎樣實現資訊化轉型?F5提供技術支撐
- Deutsche Bank:Twitter每月未登入使用者是登入使用者的兩倍
- 1位開發如何撐起一個過億使用者的小程式?
- 1個開發如何撐起一個過億使用者的小程式