# Playfish 的社交游戲架構-每月有 5000 萬用戶并且不斷增長
> 原文: [http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html](http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html)
每天有 1000 萬玩家,每月超過 5000 萬玩家使用 Facebook,MySpace 和 iPhone 等社交平臺上的 [Playfish](http://playfish.com) 游戲與朋友進行社交互動。 Playfish 是游戲行業發展最快的細分市場中的早期創新者:[社交游戲](http://radoff.com/blog/2010/05/24/history-social-games/),這是休閑游戲和社交網絡之間的摯愛。 Playfish 還是 Amazon 云的早期采用者,其系統完全在 100 臺云服務器上運行。 Playfish 發現自己處于某些熱門趨勢(可能是 EA 為什么以 [3 億美元](http://mashable.com/2009/11/09/ea-acquires-playfish-2/)買下它們,并認為 [10 億美元游戲](http://venturebeat.com/2010/04/20/ea-playfish-president-the-billion-dollar-social-game-is-achievable/)成為可能)的趨勢:在社交網絡上構建游戲, 在云中構建應用程序,移動游戲,利用數據驅動的設計來不斷發展和改進系統,敏捷開發和部署,以及將[出售為商業模型。](http://blogs.forbes.com/velocity/2010/02/23/eas-playfish-big-real-world-sales-in-virtual-goods-game/)
一家小公司如何實現所有這些目標? 為了解釋這種魔術,我采訪了 Playfish 的工程高級總監 Jodi Moran 和 Playfish 的首席建筑師,第一任工程師兼運營總監 Martin Frost。 很多好東西,讓我們繼續講究細節。

網站: [playfish.com](http://playfish.com/)
## 統計資料
1. 每月 5000 萬活躍用戶
2. 每天有 1000 萬活躍用戶
3. 100 臺服務器計算機
4. 10 款游戲,一直在發布
5. 已下載,安裝和播放了 2 億個游戲
6. 服務器與操作人員的比例為 100:1
7. 4 間工作室中的約 200 名員工和 250 名承包商

## 平臺
1. 客戶端上的 Flash
2. 服務器端的 Java
3. 一些 PHP 工具
4. 亞馬遜:EC2,CloudFront,S3,Hadoop /彈性地圖簡化,Hive,一些 SQS,一些 SimpleDB
5. HAProxy 用于負載平衡
6. MySQL 用于分片,blob 存儲
7. 碼頭應用服務器
8. [YAMI4](http://www.inspirel.com/yami4/) 用于服務傳輸。 提供點對點連接,低延遲。
## 關鍵力量
塑造 Playfish 體系結構的主要力量是什么?
1. **游戲是免費(F2P)**。 Playfish 游戲是免費的:它們不需要花錢就可以玩,但仍然需要花錢來運行。 這種模型的結果是不可能簡單地將硬件扔到問題上。 成本必須得到控制,因此它們試圖精益高效地運行。 與其他游戲機型一起,每月訂閱可補貼硬件和產品投資。 [MMO](http://en.wikipedia.org/wiki/Massively_multiplayer_online_game) (大型多人在線游戲),例如,每臺服務器可運行數百或數千個用戶。 Playfish 的目標是在此數量級以上。 MMO 可提供服務器密集型游戲體驗,但它們唯一的方法是每月收取 10 至 50 美元的訂閱費,這是一個完全不同的空間。
2. **游戲是社交游戲**。 Playfish 專注于社交游戲,這意味著您與朋友互動和互動。 實際上,您只能和真正的朋友一起玩,也可以和您的社交游戲一起玩。 游戲并不是真正贏球。 結果是按分數和水平排序的,但是人們會發揮更多的作用來表達自己并炫耀其設計技巧。 這是另一種游戲類型。 例如,在[餐廳城市](http://www.youtube.com/watch?v=a8AyQ7xBAZ0)中,目標不是成為最富有或最好的餐廳,而是擁有最具創意和表現力的餐廳。 較新的游戲甚至不再使用全球排行榜。 較早的游戲使用全球排行榜,每個人都與其他人競爭。 游戲的結構傳統上更具挑戰性,并且“看我的得分比你的得分還要大”。 現在他們有了一個排行榜,但它只是在您和您的朋友之間。 現在更親密了。 人們不在乎是否比其他國家的人更好,而在乎是否比朋友的人更好。
3. **游戲是異步**。 異步游戲是玩家可以在不同時間玩的游戲。 由于您的朋友很少同時在線,因此社交游戲是異步進行的。 你們不必都同時玩。 例如,在類似 MMO 的《魔獸世界》中,玩家同時存在于同一空間中并且可以同時行動,這使得他們對延遲非常敏感并且難以擴展。 Playfish 的游戲有所不同,它們是異步播放的單人或多人游戲。 玩家不會同時出現在同一個游戲空間中,而是在其本地客戶端中玩。 與朋友一起玩耍時,您不會受到朋友的阻攔,可以自己進步。 該模型導致各種專業設計的可能性。 異步游戲的例子是熟悉的游戲,如 Scrabble 或 Texas Hold'em,玩家輪流玩。 更具創新性的游戲是 Playfish 的“最大大腦”游戲,該游戲中的朋友不斷嘗試證明誰更聰明,它使用排行榜顯示您的朋友及其分數的圖片,因此您始終可以看到誰在領先。 這是異步的,因為每個玩家都獨立游戲,但排行榜允許所有玩家檢查彼此的進度。
4. **游戲是休閑游戲**。 異步游戲可以是硬核策略游戲,例如 1950 年代的[外交棋盤游戲](http://en.wikipedia.org/wiki/Diplomacy_(game))。 [社交游戲](http://radoff.com/blog/2010/05/24/history-social-games/)往往是[休閑游戲](http://en.wikipedia.org/wiki/Casual_game),它們確實很容易玩,只要在短時間內從任何位置單擊幾下鼠標,就可以玩。 Playfish 通過高產值 3D 圖形,易于控制,自定義角色和多人游戲挑戰擴展了該模型,從而帶來了很高的[用戶參與度](http://www.workatplay.com/think/what-user-engagement-anyway-part-1)。
5. **規模受限于各個社交網絡**的規模。 與社交意味著[難以擴展](http://highscalability.com/blog/2009/10/13/why-are-facebook-digg-and-twitter-so-hard-to-scale.html)的其他應用領域相反,對于 Playfish 社交來說,這不僅是一個擴展問題,還是一個擴展解決方案。 Playfish 游戲并不具有全球意義,因為有一百萬人不會嘗試同時玩同一游戲。 Playfish 游戲是社交性的。 他們與您的朋友一起玩的樂趣更多,而不是艱難和骯臟的比賽。 這樣的結果是,個別游戲固有地可擴展,因為它們只涉及很少的玩家。 以一個擁有 5000 萬用戶的全球排行榜為例。 在單個數據結構上需要大量寫入,并且可能需要分片以使其擴展。 由幾個參與者組成的社交網絡的排行榜更容易實現。
6. **大量用戶**。 積極玩游戲的用戶數量眾多,這給他們的體系結構帶來了壓力,要求它們擴展為整個系統。 每個單獨的游戲可能都相對容易擴展,但是對于這么多的活動游戲來說,完整的系統并不是那么容易擴展。
7. **快速增長**。 通過設計,這些游戲具有病毒性,因為它們利用了社交圖譜。 它們也很有趣,易于玩耍并有助于維持朋友之間的關系。 所有這些因素都促進了社交游戲的快速發展,這意味著 Playfish 不僅需要應對大量用戶,還必須應對持續不斷的新用戶。
8. **快速更改**。 游戲市場發展迅速,競爭激烈。 這也是一個非常新的領域,每個人仍在學習什么有效,哪些無效,流失很多。 Playfish 不能等待漫長的采購流程,漫長的設計周期或漫長的發布周期。 他們必須保持敏捷。
9. **游戲的熱門驅動性質**。 很難預測哪些游戲會成功,因此當一款游戲成功起飛時,它必須能夠立即擴展。 游戲盛行時,沒有時間利用新資源。 為每個游戲的最大預期增長分配資源根本行不通。 他們的游戲太多了,這將需要大量的服務器,而這些服務器很可能將不使用。
10. **實驗性游戲發布**。 游戲可以看作是針對利基市場的實驗。 有些實驗會比其他實驗更成功。 這回到了社交游戲行業非常敏捷的本質。
11. **多個游戲**。 Playfish 不是一家單一產品公司。 其他公司僅支持一個游戲。 Playfish 必須同時支持和開發多個游戲,并且新游戲總是按計劃進行。 這給開發和運營帶來很大壓力。
12. **智能客戶端**。 Playfish 游戲是用 Flash 編寫的,這是一個非常強大的富客戶端。 它可以智能地緩存數據,支持本地操作并消除大量服務器負載。
13. **游戲是應用程序,而不是網站**。 由于智能客戶端會刪除許多讀取,因此大多數數據庫活動都是**大量寫入**。 典型數據庫主機上 60%的負載是寫操作,而大多數網站往往讀起來很繁瑣。 由于游戲是通過網絡進行的,因此很容易將它們視為網站,但實際上它們是通過網絡交付的應用程序。
14. **重負載時間延遲**。 Playfish 游戲具有全球用戶的意義,因此具有全球性。 由于游戲是在智能客戶端中異步進行的,因此游戲等待時間并不重要,這意味著在加載游戲(即 Flash 游戲+資產)時,用戶會遇到最明顯的等待時間,因此,他們必須盡可能減少這種情況。
15. **來自用戶**的實時反饋。 社交游戲通過網絡以數字方式在社交網絡上分發,從而完全繞開了通過商店或電信公司的傳統分發渠道。 第一次沒有中間人控制游戲發行。 任何用戶都可以坐在家里,隨時隨地與他們一起玩。 游戲制作者現在可以以前所未有的方式與觀眾建立聯系。 可以直接與用戶群聯系,以幫助發展和改進游戲。 用戶可以向游戲設計師提供實時反饋,并影響他們玩的游戲的設計。
16. **社交游戲是服務,而不是盒子**。 傳統游戲是在盒子中的架子上購買的,而發行商則控制頻道。 他們向同一位 25 歲的硬核游戲玩家銷售產品。 社交游戲正在擴展到[新市場](http://venturebeat.com/2010/08/23/one-in-five-americans-plays-games-on-social-networks/),吸引了從未玩過游戲的人。 作為一項服務的游戲在玩家和游戲背后的創意團隊之間建立了非常長的關系。 可以每周發布一次,一起培養游戲,并不斷學習玩家的需求。 在擁有多年的開發周期之前,這是不可能的。
17. **人們已斷開連接,正在尋找連接**的方法。 寵物協會是一個虛擬的世界,玩家在這里裝飾自己的房屋和朋友的房屋。 在圣誕節前后,他們開始以每個 2 美元的價格出售虛擬圣誕節和裝飾品。 他們出售了價值 4000 萬美元的虛擬貨幣。 行為分析的忠實擁護者,他們問用戶為什么要這么做? 歸結為與斷開聯系的人們建立聯系。 以前,他們家里會有一棵樹,人們會看到樹和他們的創造力。 現在人們都斷開了連接,因此 3-4 個朋友可以看到真實的圣誕樹,而他們所有的朋友都可以看到 Facebook 上的虛擬圣誕樹。 在吸引人方面,您的虛擬貨幣有更大的優勢。 推動購買的是對社交表達自我的渴望,虛擬商品是手段,社交網絡是新領域。 就像在現實世界中一樣,購買虛擬禮物是為了在與朋友互動中獲得感知的價值。
18. **背景模擬**。 像 Restaurant City 這樣的游戲開始具有后臺模擬組件,即使用戶不在網上也可以運行。 這導致游戲以鼓勵玩家定期回頭的方式發展。 例如,在《餐廳城》中,玩家需要確保為餐廳員工提供食物。 此模擬組件是一個有趣的新負載,必須將其集成到游戲基礎結構中。
19. **需要一次縮放幾個不同的維度**。 Playfish 需要擴展以支持更多的用戶,更多的游戲,每位用戶更多的數據,每位用戶更多的訪問權限,更多的開發人員和更多的運營人員。 擴展最困難的事情是擴展支持一切的人員。
## 關鍵擴展策略
為了應對這些力量,Playfish 遵循了一些關鍵的擴展策略:
1. **樂趣**。 為了推動增長,關鍵的設計指標是創造一款如此有趣的游戲,以至于它會產生強烈的情感,使人們感到他們只需要玩游戲,就必須邀請他們的朋友加入游戲,以獲得更多的樂趣。 在朋友的社交網絡中分享情感時,情感會最大化。 傳統游戲是具有出色聲音和圖形的沉浸式體驗。 Playfish 嘗試設計用于社交互動的游戲,通過邀請朋友讓您從游戲中受益。 您可以自己玩 Restaurant City,但邀請您的朋友在您的餐廳做飯會更有趣。 通過在游戲中添加朋友,您會逐漸獲得更多樂趣。 用戶希望與朋友互動以獲得更多樂趣的愿望推動了更大的發行量和增長。
2. **基于微交易的收入模型**。 [微型交易](http://blogcritics.org/gaming/article/microtransactions-in-games/)通常是高交易量,低價值的交易。 為了支付服務費用,Playfish 通過玩家購買游戲內虛擬物品和服務來賺錢。 Playfish 還從廣告和[產品展示位置](http://venturebeat.com/2010/04/20/ea-playfish-president-the-billion-dollar-social-game-is-achievable/)中獲利。 該策略支持免費游戲模式,同時基于自然游戲收入提供收入。
3. **云**。 Playfish 從一開始就一直是 100%基于云的,并于 2007 年在 EC2 上發布了他們的第一款測試版游戲。云幾乎是我們上一節所介紹的眾多力量的完美答案。 我不會談論云的所有[奇觀,但您很容易看到彈性如何幫助解決他們的許多可變需求問題。 如果游戲變得流行,它們可以增加更多資源來處理負載。 無需采購流程。 如果需求下降,他們可以簡單地將實例退還給您。 云的 API / IaaS(基礎設施即服務)性質可以輕松滿足其對敏捷性的需求,保持團隊規模的需求以及早期及經常發布的要求。 您可能會認為按使用付費模式的云太昂貴了,我們將在云部分中對此進行更多討論,但是他們并不這么認為。 他們更加擔心無法在快速發展的市場中開發新游戲和改進現有游戲的機會成本。](http://highscalability.com/how-do-you-explain-cloud-computing-your-grandma)
4. **SOA(面向服務的體系結構)**。 他們在 SOA 方面非常重要。 這是他們架構的組織原則以及他們如何構造團隊。 每個游戲都被視為單獨的服務,并且彼此獨立發行。 內部組織成提供 API 的組件的軟件,并且這些組件分別進行管理和可伸縮。
5. **分片**。 Playfish 是一項寫重服務。 為了處理寫入,Playfish 采用了[分片架構](http://highscalability.com/blog/category/shard),因為這是擴展寫入的唯一真正方法。
6. **BLOB** 。 沒有為用戶存儲多個記錄。 相反,用戶數據存儲在 MySQL 中的 [BLOB](http://en.wikipedia.org/wiki/Blob_(computing)) (二進制大對象)中,因此可以通過鍵值方法快速訪問它。
7. **異步**。 在服務器上進行寫操作與游戲是異步的。 用戶不必等待服務器上的寫入完成就可以繼續玩游戲。 他們試圖盡可能向用戶隱藏延遲。 在 MMO 中??,每一步都必須傳達給所有用戶,而延遲是關鍵。 Playfish 游戲并非如此。
8. **智能客戶端**。 通過使用智能 Flash 客戶端,Playfish 能夠利用客戶端計算機上更高的處理能力。 隨著他們添加更多用戶,他們還增加了更多的計算能力。 他們必須正確平衡服務器端和客戶端端的內容。 適當的組合因游戲而異。 智能客戶端緩存讀取內容,但它也允許游戲在客戶端上獨立進行,而無需與服務器對話。
9. **數據驅動的游戲改進**。 Playfish 收集了大量的游戲數據,用于持續改進現有游戲并幫助確定接下來要發明的游戲。 他們正在使用 Amazon 的 Elastic Map Reduce 作為其分析平臺。
10. **敏捷**。 Playfish 的所有思想中的一個共同點是對靈活性的不懈需求,以便能夠快速,輕松,高效地應對各種情況。 敏捷性體現在他們對云的選擇上,圍繞服務進行組織,快速發布周期,保持團隊規模小和有能力,并通過數據挖掘和客戶反饋不斷改進游戲設計。
## 基本游戲架構
1. 游戲在 Flash 客戶端中運行。
2. 客戶端以服務級別 API 的形式將請求發送到 HAProxy 服務器,該服務器在 Amazon 云中運行的 Jetty 應用程序服務器之間負載均衡請求。
3. 所有后端應用程序均使用 Java 編寫,并使用面向服務的體系結構進行組織。
4. Jetty 服務器都是無狀態的,從而簡化了部署,升級并提高了可用性。
5. MySQL 被用作數據層。 數據在 MySQL 服務器之間進行分片,并以 BLOB 格式存儲。
6. Playfish 是 Amazon 云的早期采用者,因此他們無法利用諸如負載平衡之類的 Amazon 后來的開發。 如果他們必須從頭開始,他們可能會朝這個方向發展。
7. 更改被異步推送到服務器。 該系統的設計不是讓用戶單擊按鈕,而是將操作發送到服務器以查看發生了什么,而是使系統有權讓客戶端決定操作是什么,然后由服務器檢查該操作是否有效。 處理在客戶端。 如果用戶和服務之間存在高延遲,則由于異步保存和智能客戶端,用戶將看不到它。 在一天結束時,用戶看到的才是最重要的。 重要的是,當網絡中出現故障或等待時間較長時,用戶將獲得有趣的游戲體驗。
8. Playfish 的前幾款游戲是簡單的單人游戲,例如《誰擁有最大的大腦》,并具有高分和挑戰等功能。 在服務器端不是很復雜,也不是很沉重。 從項目開始到結束,他們只有 5 周的時間。 其中包括對 Facebook API 的學習和編碼,對 AWS 的學習和編碼,對游戲服務器的編碼以及建立生產基礎架構。 前三場比賽延續了這種模式:高分和挑戰。 這給了他們一些喘息的空間,可以開始建立自己的基礎架構。 改變事物的第一款游戲是 2008 年的寵物協會。這是第一款大量使用虛擬物品的游戲。 數據存儲從為每個用戶存儲一些屬性(如化身定制和高分)到為每個虛擬項目存儲每個用戶潛在的數千個項目。 這給系統帶來很大壓力。 早期,隨著服務增長非常迅速,出現了一些大服務問題。 然后他們進行分片,系統變得更加穩定。 但是首先,他們嘗試了其他各種技術。 他們嘗試一次添加更多的只讀副本,例如一次添加 12 個,但這并沒有真正起作用。 他們嘗試盡最大可能修補系統。 然后他們咬住子彈并放入分片中。 從開始到推出共花了 2 周的時間。 在該游戲中,所有性能問題都消失了。 隨著時間的流逝,用戶獲得了很多虛擬物品,因此行的數量爆炸了。 每個項目都存儲在其自己的行中。 即使您將用戶劃分為舊用戶的碎片,即使用戶數量保持不變,碎片也會不斷增長。 這是轉到 BLOB 的原始驅動程序之一。 BLOB 擺脫了導致此類性能問題的多個行。 隨著時間的流逝,游戲開始變得越來越復雜。 寵物協會沒有任何模擬元素。 然后,他們在 2008 年底推出了“餐廳城市”,該餐廳具有第一個離線模擬元素。 當玩家不在時,您的餐廳繼續營業并賺錢。 這帶來了挑戰,但是在云中添加額外的處理相對簡單。 模擬邏輯是在客戶端中實現的,服務器將執行諸如檢查欺詐的操作。
## 面向服務的架構
1. Playfish 確實是 SOA 的主要倡導者。 SOA 將數據和功能封裝在一起,可以通過分布式系統獨立部署。 分布式組件通過稱為*服務合同*的 API 進行通信。
2. 服務確保系統所有部分之間的依賴性是眾所周知的,并且盡可能松散耦合。
3. 支持復雜性管理。 該系統可以組成單獨的易于理解的組件。
4. 組件是獨立部署和升級的,這提供了靈活性和敏捷性,并使得擴展開發和運營團隊變得更加容易。
5. 可以獨立于其他服務來優化獨立服務。
6. 服務失敗時,更容易正常降級。
7. 每個游戲都被視為一項服務。 UI 和后端是一個包。 他們沒有分別發布 UI 和后端。
## 云端
1. Playfish 從一開始就是 100%基于云的,于 2007 年在 Beta 版 EC2 上發布了他們的第一款游戲。
2. Cloud 使 Playfish 能夠以極低的摩擦力進行創新并嘗試新功能和新游戲,這是快速發展的市場的關鍵。 從他們的多個只讀副本系統遷移到分片系統需要 2 個星期,如果沒有云的靈活性,這是不可能完成的。
3. 云使他們能夠專注于使他們與眾不同的地方,而不是構建和管理服務器。 由于云運營無需專注于機器維護,因此他們可以專注于更高價值的服務,例如跨所有不同服務器和游戲開發自動化。
4. 現在,在設計應用程序時將容量視為一種商品。
5. 服務器與操作人員的比例為 100:1。 由于云基礎架構,如此高的比率是可能的。
6. 服務器發生故障,因此必須從頭開始計劃。
7. 不可能繼續向服務器添加內存,因此您可能必須提前擴展。
8. 云的關鍵特征是*靈活性*。 您可以根據需要靈活地進行操作。 當您突然得到大量流量時,您無需感到驚訝。 您不必等待服務器的采購。
9. 您永遠都不知道游戲將以多快的速度起飛。 有時您確實知道,體育游戲發展很快,但其他游戲可能會突然爆炸。 在云中,這不一定是問題。
10. 從一開始,就從來沒有想到它們可以在云中進行擴展。 一切都旨在通過添加更多計算機來擴展。
11. 他們不能使用所有的 Amazon 服務,因為必須自己滾動。 離開他們所了解的自己的系統會帶來不必要的風險。 例如,沒有 ELB 和 RDS,因此必須自己構建。 現在切換到那些服務沒有任何意義。
12. Playfish 是云的核心。 他們充分利用了云中的一切。 輕松獲取更多容量。 他們根本沒有內部服務器。 所有開發機器都在云中。 云使啟動新環境變得輕而易舉。 例如,要測試分片很容易,只需使用新配置復制所有內容即可。 在數據中心中運行時,這要困難得多。
13. 考慮到所有因素,**云比裸機更昂貴**。
1. 基于帶寬和機架空間的單位,裸機可能看起來更便宜,但是如果您查看所獲得的所有東西,那將是很多工作。 以高級可用性功能為例。 更改 API 調用,您將獲得雙數據中心。 在裸機情況下,您無法做到這一點。 僅考慮設置和維護的人員成本。 云看起來確實很昂貴,但是當您獲得真正大容量時,中斷就開始了。
2. 要考慮的主要成本是**機會成本**。 這是最大的優勢。 例如,當他們第一次在 Pet Society 中實施分片時,從開始到部署需要 2 周。 用戶立即感到高興。 它們的實現速度取決于能夠在生產中激發整個服務器負載以及測試和遷移數據。 如果您有兩個月的交貨時間,那么您將有兩個月不滿意的用戶。
14. Playfish 在同一區域內的多個可用區中運行。 服務器相對靠近,這減少了延遲。 它們不會像 MMO 系統那樣散布開來。 使用異步寫入,客戶端中的緩存和 CDN 中的緩存在更高級別上處理延遲。 在服務器上執行游戲操作可能需要 3 秒鐘,但是由于它是異步的,因此用戶不會注意到。 CDN 有助于減少他們注意到的內容,即資產和游戲的負載。
15. CloudFront 用于減少負載延遲。 從某種意義上說,Playfish 是全球性的,擁有世界各地的用戶。 游戲的加載時間(包括 Flash 代碼和游戲資產)是它們最明顯的延遲。 CloudFront 可以在分發內容時減少這種延遲。
## 數據庫系統
1. MySQL 被用作存儲 BLOB 的分片鍵值數據庫。
2. 用戶跨多個數據庫集群進行分片,每個集群都有自己的主副本和只讀副本。
1. 他們擁有更多副本的好處不多,因為它們寫得很重。 幾乎所有流量都是寫操作。 寫入很難縮放。 無法緩存,更多的只讀副本無濟于事。
2. 在較早的體系結構中,他們有一個具有 12 個讀取從屬設備的主設備,表現不佳。
3. 通過分片,他們從一個母版和 12 個只讀副本變成了兩個母版和兩個只讀副本,這對讀寫都有幫助。
3. 分片意味著索引變小,這意味著它們可以容納在內存中。 將索引保留在緩存中可確保用戶查找不必打到磁盤,可以從 RAM 提供查找。
4. 通過分片,他們可以控制每個分片中有多少用戶,因此,他們可以確保自己不會破壞內存索引緩存并開始訪問磁盤。
5. 他們試圖優化用戶記錄的大小,以便更多用戶可以容納在內存中。 這就是為什么他們去存儲 BLOB 而不是使用標準化為行的數據的原因。 現在,每個用戶只有一個數據庫記錄。
6. 工作從數據庫服務器中取出并移到應用程序服務器,這些服務器很容易在云中水平擴展。
7. 大多數網站都使用諸如內存緩存之類的擴展技術來進行讀取緩存,而這些技術對 Playfish 并不那么有用。 使用 Flash 客戶端時,將在 memcache 中緩存的大部分內容都將緩存在客戶端中。 將其發送到服務器一次并存儲。
8. 分片用于獲得更高的寫入性能。
1. 寫操作占 60%的工作量。 通常情況下是 10:1。 他們仍然使用 MySQL 進行數據存儲,因為他們對負載等情況下的性能統計非常滿意。
2. 每個分片都有一個母版,至少在只讀副本上。 大多數情況下,只有一個只讀副本,但這取決于服務的訪問模式。 讀取將拆分為讀取副本。 對于確實具有更多讀取的一些地方,它們具有更多的讀取副本。 只讀副本還用于遠程保留數據作為備份。
9. Playfish 是由純粹的必需品驅動的。 他們建立了自己的鍵值存儲,因為必須這樣做。 為什么不使用 NoSQL? 他們正在研究選項,但同時他們有一個可行的解決方案,他們知道它將如何工作。 對 NoSQL 解決方案感興趣,用于操作端,用于管理多個數據庫。 進入運行 NoSQL 的模式并不容易,但這是由其需求驅動的。
10. 在橫向擴展情況下,您必須進行分片之類的操作,此時許多 SQL 功能都將消失。 您必須自己做很多工作。 現在,當您進行大批拆分時,您將無法添加索引。
11. 使用 NoSQL 時,您將放棄訪問模式的靈活性。 關系數據庫非常好,因為您可以隨時以所需的方式訪問數據。 例如,由于他們不能再使用 SQL 來匯總字段,因此它們都可以即時聚合或使用批處理過程進行聚合。
12. 備份到 S3。
## Flash-客戶端
1. 客戶端的 CPU 和資源隨用戶數量的增加而擴展,因此明智地利用客戶端。 將盡可能多的處理推送給客戶端。
2. 更改被異步寫回到服務器,這有助于向用戶隱藏網絡延遲。
3. 在服務器端檢查更改以檢測作弊。
4. Flash 使用服務級別 API 與 Jav??a 應用程序服務器對話。
5. 使處理過程更接近客戶端可為用戶帶來更好的體驗。 網站使服務器更靠近用戶。 Playfish 在客戶端上使處理過程更加緊密。
## YAMI4-訊息
1. 經過長時間的評估,YAMI4 是 Playfish 決定使用的消息傳遞系統。 它提供點對點連接,低延遲,無單點故障以及異步消息傳遞,以在多個后端服務中進行事件驅動的處理和并行處理。
2. 服務經過發現階段以了解每個端點的位置后,消息將直接在服務之間傳輸。 這是一種無經紀人的模式。 消息不會集中到集中式服務中,然后再重新分發。 使用此模型,消息傳遞非常有效,因為沒有中間躍點,因此減少了延遲。 他們特別不想讓一個單獨的組件來處理流量,然后傳遞消息。 這種方法減少了故障點和延遲。
3. 被認為是節儉的,但是 YAMI4 因其異步操作而獲勝。 Thrift 使用看起來像本地函數調用的 RPC 模型,這使得處理錯誤,超時等更加困難。YAMI4 是消息傳遞模型,而不是 RPC 模型。
4. YAMI4 不處理服務發現方面,而是在發現階段然后直接與其他服務對話的基礎上構建自己的服務。 互聯網的運作方式更多。
5. 作為消息傳遞系統,消息不會調用對象上的方法。 也沒有對象在網絡上流動。 對象存在于服務中。 每個服務負責激活,鈍化和調度操作。
## 處理多個社交網絡
1. 他們的主要挑戰之一是能夠支持這么多不同且越來越不同類型的游戲。
2. 盡可能使用*松耦合*的原理:
1. 團隊擁有的服務使團隊結構與體系結構相匹配。
2. 服務保持良好定義的接口,以便每個團隊可以迭代并部署自己的服務,而不會影響其他團隊。
3. 當需要更改接口時,將對接口進行版本控制。 他們試圖保持向后兼容性,以便其他團隊不必推出更改。
3. 為了促進所有這些,將一套通用的標準應用于所有服務:
1. 公共服務運輸(YAMI4)
2. 通用操作標準,例如如何配置服務以及它們如何提供監視信息。
4. 通用標準和松散耦合的結合使開發和運營團隊既靈活又高效。
## 開發與運營
1. 服務彼此獨立發布。
2. 資源按服務分開。 一項服務出現問題不會影響不相關的服務。
3. 團隊是按服務組織的,盡管有一些重疊。
4. 盡管存在密切的關系,但運營團隊與開發團隊是分開的。 沒有大的交接階段。 他們不只是在墻上扔一個釋放。 操作包括在設計中。
5. 開發人員不發布代碼。 他們將其檢入并由操作人員將其撿起。
6. 團隊在部署方面具有很大的靈活性。 大多數游戲每周發布一次。 一切都是迭代的,這意味著代碼足以投入使用,但功能不一定完全完成。 每周發布周期對于帶有虛擬物品的游戲特別有價值,因為用戶喜歡每周都知道有新的令人興奮的東西。 其他團隊可以使用更長的功能塊。 這取決于。 這是從事 SOA 的優勢之一。 團隊可以獨立工作。 不需要一個發布周期。
## Java-服務器
1. Java 支持創建干凈的可重用組件。
2. 有大量的開源庫。
3. Java 是靈活的:它可用于實現 Web 應用程序,流程請求,批處理和事件驅動的系統。
4. Java 有許多調優選項。 他們做了很多工作來調整垃圾回收以提高性能。
## 游戲設計
1. 為了使游戲用戶享受 Playfish 的樂趣,它將數據驅動的設計與良好的,受人啟發的古老游戲設計結合在一起。 數據可用于指導用戶制作游戲的許多決策。 他們可以從數據中看到用戶最擅長的事情。 這告訴了他們如何使游戲和個人游戲變得更好,以及在設計新游戲時該怎么做。
2. Playfish 喜歡行為分析。 他們查看人們在游戲中正在做什么,然后問他們為什么。 在支持方面,客戶端和服務器具有很大的能力來生成有關用戶操作的事件。 然后處理這些事件,以創建有關用戶在游戲中所做操作的匯總信息。 他們現在正在使用 EMR / Hadoop / Hive 來通過類似 SQL 的界面訪問大量的數據。 在云中使用 EMR 的效果非常好,他們對此非常滿意。 大量數據可以粒度形式存儲,并且由于所有內容都可以并行工作,因此仍然可以快速找出所需內容,非常適合游戲產生的事件類型數據。
3. 用戶想要什么真是令人驚訝。 他們甚至可能自己都不知道。 人們認為他們想要的與人們實際使用的有所不同。 有時,用戶會說他們確實想要一些昂貴的功能,但最終卻沒有使用它們。 然后是沒有人提及但人們一直在使用的功能。 在論壇上發帖的人通常是不喜歡事物的人,因此很容易獲得一種非常不平衡的觀點,因為他們對游戲充滿熱情,討厭任何變化。 數據有助于找出人們真正喜歡的東西。
4. 游戲設計不能只是數據驅動的,否則游戲將毫無生氣。 您必須正確獲得數據驅動的平衡。 您不能僅僅按照數據說明的去做。 隨您的靈感去增加或增加游戲中的內容,然后使用數據來完善游戲。
5. 某些功能需要大量的工作來創建,但由于功能太復雜,用戶并沒有最終完成。 他們設置了渠道,以了解人們是否在完成功能之前就放棄了功能,然后他們就能找出原因。 也許某個功能需要調整或放棄。 參與度是用戶對游戲的熱愛程度的衡量標準。 然后,他們投資使人們回頭的內容,以便生態系統得以發展。
6. 敏捷+數據+設計=允許快速試用新啟發的功能,以查看它們是否有效。 結果是一個有趣的游戲。
7. 團隊分為緊密的小組,這些小組具有完全的創作自由。 所有團隊成員都對什么使游戲更有趣發表了意見。
8. 運行游戲實驗是為了尋找合適的位置,以查看合適的位置。 有些會成功,有些會失敗。
## 得到教訓
1. **建立一個利用應用程序特殊性質的體系結構。** Playfish 已針對其特定需求量身定制了一種體系結構。 不要嘗試構建可以擴展所有內容的通用體系結構。 利用空間的本質,使生活盡可能輕松。
2. **不用擔心第一次正確**。 把東西拿出來,開始學習。 如果他們試圖達到 3 年前的現狀,那么他們仍然會構建系統。 他們提出了一些根本無法擴展的東西,但他們在 5 周內就解決了。 這是關鍵。
3. **不要害怕堅持知道和了解的東西**。 選擇您熟悉的東西。 您不需要選擇最新和最酷的產品。 充分了解產品并能夠預測產品在您的用例中的運作方式具有很多價值。 這樣,您將減少很多麻煩。
4. **首先保持簡單,然后在需要時進行擴展**。 利用該提前期來構建您所需的內容。
5. **碎片和 BLOB** 。 使用分片擴展寫操作。 使用 BLOB 將每個用戶的記錄數減少到一。 這樣可以加快對象訪問速度,并允許在 RAM 中添加更多對象。
6. **總是有一個粗略的想法,你將如何擴展**。 不要過早設計功能,但不要創建破壞性的依賴關系。 例如,可以在不進行適當縮放的情況下啟動就可以了,擁有在分片后無法使用的功能也不是一件很酷的事情。
7. **縮放數據比縮放處理**困難。 您在哪里存儲數據? 有多少人需要讀寫? 無狀態應用程序服務器使添加更多處理變得容易,而數據擴展則困難得多。
8. **不要過度復雜**。 擴展簡單系統更容易。 保持盡可能長的簡單性。 這使您可以了解痛點所在,然后可以專門解決這些痛點。 許多人認為他們必須從第一天開始就建造巨大的東西。 例如,如果您不需要多級緩存,則不要放入它,因為您必須支持它。
9. **使用 SOA 管理復雜性**。 隨著新游戲的添加,將代碼分成由不同團隊管理的不同組件有助于降低系統的整體復雜性,從而使一切易于擴展。
10. **承擔計算的風險**。 Playfish 進入了云環境,但是有一個備份計劃,以防萬一失敗。 這是一種風險,但也有很多好處。 如果亞馬遜取消了他們的服務,那么如果他們真的需要,他們可以搬家。 這就是使用“基礎架構即服務”的好處。 使用“平臺即服務”存在更大的風險,因為您建立了更深的依賴關系。 例如,當 fPlayfish 擁有自己的有效鍵值數據庫時,轉移到 NoSQL 產品的風險也太大。
11. **運營和開發應了解系統如何在生產中工作**。 容易管理嗎? 支持客戶容易嗎? 如何配置和監視它? 開發您需要實現所有這些的東西。 開發人員不能只是在墻上扔代碼。 應該沒有墻。
12. **使用數據可以幫助您找到人們真正喜歡的東西。** 用戶并不總是知道自己最喜歡什么。 檢測您的代碼并分析數據以找到有意義的模式,并使用該信息來不斷改進系統。
13. **最難擴展的是人**。 必須使人們的工作變得非常容易。 獲得更多的服務器要比獲得更多的人容易得多。
我要感謝 Playfish 抽出寶貴時間進行了這次翔實而有見地的采訪。 如果您希望 HighScalability.com 上具有您的體系結構,請[與我](http://highscalability.com/contact/)聯系以開始使用。
Playfish 正在尋找人。 有關職業機會,請參見其[職位頁面](http://www.playfish.com/?page=jobs)。 從我與幾個人的交往中,一個 Playfish,他們似乎把他們的東西放在一起。 值得一看的是,他們有很多空缺職位,他們正在尋找服務器端工程師。 他們希望構建新系統,以使用 EMR / Haddop / Hive 更好地了解用戶,并擴展整個系統以添加更多用戶和游戲。
## 相關文章
1. [Playfish 展示了“游戲即服務”如何在云中擴展](http://www.readwriteweb.com/cloud/2010/08/playfish-shows-how-games-as-a-.php)
2. [訪談:Playfish 通過我的帝國在簡單的動作中尋找意義](http://www.gamesetwatch.com/2010/08/interview_playfish_on_finding.php)
3. [AWS 案例研究:Playfish](http://aws.amazon.com/solutions/case-studies/playfish/)
4. [EA Playfish 高管吹捧下一代 Facebook 游戲](http://venturebeat.com/2010/05/14/ea-playfish-exec-sebastien-dehalleux-touts-next-generation-facebook-games/)
5. [深入了解:Playfish](http://blog.kissmetrics.com/an-in-depth-look-playfish/)
6. [介紹 Playfish](http://www.slideshare.net/sdehalleux/introducing-playfish)
7. [在社交游戲峰會](http://www.insidesocialgames.com/2008/06/13/lives-notes-from-asynchronous-games-on-social-networks-at-social-gaming-summit/)上直播“社交網絡異步游戲”的筆記
8. 視頻: [SGS09:大規模構建社交游戲](http://www.youtube.com/watch?v=dLCSGm_tkfM)。
9. 視頻: [SGS2008:社交網絡上的異步游戲](http://www.youtube.com/watch?v=3zIXY1upwTI)。
10. [異步游戲](http://www.cs.vu.nl/~eliens/media/pattern-asynchronousgames.html)。
11. [異步多人游戲:Ian Bogost 的休閑多人游戲體驗](http://www.bogost.com/writing/asynchronous_multiplay_futures.shtml)的未來。
非常有趣的東西-感謝分享!
我真的沒有這樣的句子:“要招募更多的人要比招募更多的人容易得多。” 請解釋。
謝謝托德,它非常有用。
順便說一句,我喜歡 Playfish 的運作方式:
> 由于您的朋友很少同時在線,因此社交游戲是異步進行的。
如果您認為 Cloud 最好,那顯然是因為您尚未大規模使用它。 我們在亞馬遜上運行著數百臺服務器,而連接問題的數量(即無法到達實例,x 可用區網絡問題)和它們具有的 I / O 性能讓我們感到“驚訝”; 在過去的六個月中,他們最長可以無問題地停留的時間是 8 天,這意味著我們每周或更少的時間都會因為亞馬遜的“超級云”而獲得生產“成功”。
我的建議:使用云來擴展和穩定,然后移開地獄。 干杯。
這是拼寫錯誤的塞巴斯蒂安,謝謝。
克里斯,那是您的現代時代:-)
很棒的文章 Tood,感謝您提供。 Playfish 在數據庫分片方面的經驗與我們在快速增長的 dbShards 實現中所發現的完全一樣。 如上文所述,由于利用內存來實現數據庫平衡,因此我們的社交應用程序以出色的性能運行。
關于此報價:
> 在橫向擴展情況下,您必須進行分片之類的操作,此時許多 SQL 功能都將消失。 您必須自己做很多工作。 現在,當您進行大批拆分時,您將無法添加索引。
我們可以輕松支持混合使用典型表和鍵/值 blob 數據,就像 Playfish 一樣。
我想知道其他人怎么想:傳統表結構與鍵/值 Blob 的無縫結合? 在這兩種情況下,我們都可以支持高可用性操作,而無需開發人員的任何努力。 這樣,您可以從常規表中獲得所有索引/搜索優勢,并且它們可以在適當的地方指向 Blob 值(例如,用戶個人資料信息)。
很棒的文章。
他們使用什么 Web 服務器?
- LiveJournal 體系結構
- mixi.jp 體系結構
- 友誼建筑
- FeedBurner 體系結構
- GoogleTalk 架構
- ThemBid 架構
- 使用 Amazon 服務以 100 美元的價格構建無限可擴展的基礎架構
- TypePad 建筑
- 維基媒體架構
- Joost 網絡架構
- 亞馬遜建筑
- Fotolog 擴展成功的秘訣
- 普恩斯的教訓-早期
- 論文:Wikipedia 的站點內部,配置,代碼示例和管理問題
- 擴大早期創業規模
- Feedblendr 架構-使用 EC2 進行擴展
- Slashdot Architecture-互聯網的老人如何學會擴展
- Flickr 架構
- Tailrank 架構-了解如何在整個徽標范圍內跟蹤模因
- Ruby on Rails 如何在 550k 網頁瀏覽中幸存
- Mailinator 架構
- Rackspace 現在如何使用 MapReduce 和 Hadoop 查詢 TB 的數據
- Yandex 架構
- YouTube 架構
- Skype 計劃 PostgreSQL 擴展到 10 億用戶
- 易趣建筑
- FaceStat 的禍根與智慧贏得了勝利
- Flickr 的聯合會:每天進行數十億次查詢
- EVE 在線架構
- Notify.me 體系結構-同步性
- Google 架構
- 第二人生架構-網格
- MySpace 體系結構
- 擴展 Digg 和其他 Web 應用程序
- Digg 建筑
- 在 Amazon EC2 中部署大規模基礎架構的六個經驗教訓
- Wolfram | Alpha 建筑
- 為什么 Facebook,Digg 和 Twitter 很難擴展?
- 全球范圍擴展的 10 個 eBay 秘密
- BuddyPoke 如何使用 Google App Engine 在 Facebook 上擴展
- 《 FarmVille》如何擴展以每月收獲 7500 萬玩家
- Twitter 計劃分析 1000 億條推文
- MySpace 如何與 100 萬個并發用戶一起測試其實時站點
- FarmVille 如何擴展-后續
- Justin.tv 的實時視頻廣播架構
- 策略:緩存 404 在服務器時間上節省了洋蔥 66%
- Poppen.de 建筑
- MocoSpace Architecture-一個月有 30 億個移動頁面瀏覽量
- Sify.com 體系結構-每秒 3900 個請求的門戶
- 每月將 Reddit 打造為 2.7 億頁面瀏覽量時汲取的 7 個教訓
- Playfish 的社交游戲架構-每月有 5000 萬用戶并且不斷增長
- 擴展 BBC iPlayer 的 6 種策略
- Facebook 的新實時消息系統:HBase 每月可存儲 135 億條消息
- Pinboard.in Architecture-付費玩以保持系統小巧
- BankSimple 迷你架構-使用下一代工具鏈
- Riak 的 Bitcask-用于快速鍵/值數據的日志結構哈希表
- Mollom 體系結構-每秒以 100 個請求殺死超過 3.73 億個垃圾郵件
- Wordnik-MongoDB 和 Scala 上每天有 1000 萬個 API 請求
- Node.js 成為堆棧的一部分了嗎? SimpleGeo 說是的。
- 堆棧溢出體系結構更新-現在每月有 9500 萬頁面瀏覽量
- Medialets 體系結構-擊敗艱巨的移動設備數據
- Facebook 的新實時分析系統:HBase 每天處理 200 億個事件
- Microsoft Stack 是否殺死了 MySpace?
- Viddler Architecture-每天嵌入 700 萬個和 1500 Req / Sec 高峰
- Facebook:用于擴展數十億條消息的示例規范架構
- Evernote Architecture-每天有 900 萬用戶和 1.5 億個請求
- TripAdvisor 的短
- TripAdvisor 架構-4,000 萬訪客,200M 動態頁面瀏覽,30TB 數據
- ATMCash 利用虛擬化實現安全性-不變性和還原
- Google+是使用您也可以使用的工具構建的:閉包,Java Servlet,JavaScript,BigTable,Colossus,快速周轉
- 新的文物建筑-每天收集 20 億多個指標
- Peecho Architecture-鞋帶上的可擴展性
- 標記式架構-擴展到 1 億用戶,1000 臺服務器和 50 億個頁面視圖
- 論文:Akamai 網絡-70 個國家/地區的 61,000 臺服務器,1,000 個網絡
- 策略:在 S3 或 GitHub 上運行可擴展,可用且廉價的靜態站點
- Pud 是反堆棧-Windows,CFML,Dropbox,Xeround,JungleDisk,ELB
- 用于擴展 Turntable.fm 和 Labmeeting 的數百萬用戶的 17 種技術
- StackExchange 體系結構更新-平穩運行,Amazon 4x 更昂貴
- DataSift 體系結構:每秒進行 120,000 條推文的實時數據挖掘
- Instagram 架構:1400 萬用戶,1 TB 的照片,數百個實例,數十種技術
- PlentyOfFish 更新-每月 60 億次瀏覽量和 320 億張圖片
- Etsy Saga:從筒倉到開心到一個月的瀏覽量達到數十億
- 數據范圍項目-6PB 存儲,500GBytes / sec 順序 IO,20M IOPS,130TFlops
- 99designs 的設計-數以千萬計的綜合瀏覽量
- Tumblr Architecture-150 億頁面瀏覽量一個月,比 Twitter 更難擴展
- Berkeley DB 體系結構-NoSQL 很酷之前的 NoSQL
- Pixable Architecture-每天對 2000 萬張照片進行爬網,分析和排名
- LinkedIn:使用 Databus 創建低延遲更改數據捕獲系統
- 在 30 分鐘內進行 7 年的 YouTube 可擴展性課程
- YouPorn-每天定位 2 億次觀看
- Instagram 架構更新:Instagram 有何新功能?
- 搜索技術剖析:blekko 的 NoSQL 數據庫
- Pinterest 體系結構更新-1800 萬訪問者,增長 10 倍,擁有 12 名員工,410 TB 數據
- 搜索技術剖析:使用組合器爬行
- iDoneThis-從頭開始擴展基于電子郵件的應用程序
- StubHub 體系結構:全球最大的票務市場背后的驚人復雜性
- FictionPress:在網絡上發布 600 萬本小說
- Cinchcast 體系結構-每天產生 1,500 小時的音頻
- 棱柱架構-使用社交網絡上的機器學習來弄清您應該在網絡上閱讀的內容
- 棱鏡更新:基于文檔和用戶的機器學習
- Zoosk-實時通信背后的工程
- WordPress.com 使用 NGINX 服務 70,000 req / sec 和超過 15 Gbit / sec 的流量
- 史詩般的 TripAdvisor 更新:為什么不在云上運行? 盛大的實驗
- UltraDNS 如何處理數十萬個區域和數千萬條記錄
- 更簡單,更便宜,更快:Playtomic 從.NET 遷移到 Node 和 Heroku
- Spanner-關于程序員使用 NoSQL 規模的 SQL 語義構建應用程序
- BigData 使用 Erlang,C 和 Lisp 對抗移動數據海嘯
- 分析數十億筆信用卡交易并在云中提供低延遲的見解
- MongoDB 和 GridFS 用于內部和內部數據中心數據復制
- 每天處理 1 億個像素-少量競爭會導致大規模問題
- DuckDuckGo 體系結構-每天進行 100 萬次深度搜索并不斷增長
- SongPop 在 GAE 上可擴展至 100 萬活躍用戶,表明 PaaS 未通過
- Iron.io 從 Ruby 遷移到 Go:減少了 28 臺服務器并避免了巨大的 Clusterf ** ks
- 可汗學院支票簿每月在 GAE 上擴展至 600 萬用戶
- 在破壞之前先檢查自己-鱷梨的建筑演進的 5 個早期階段
- 縮放 Pinterest-兩年內每月從 0 到十億的頁面瀏覽量
- Facebook 的網絡秘密
- 神話:埃里克·布魯爾(Eric Brewer)談銀行為什么不是堿-可用性就是收入
- 一千萬個并發連接的秘密-內核是問題,而不是解決方案
- GOV.UK-不是你父親的書庫
- 縮放郵箱-在 6 周內從 0 到 100 萬用戶,每天 1 億條消息
- 在 Yelp 上利用云計算-每月訪問量為 1.02 億,評論量為 3900 萬
- 每臺服務器將 PHP 擴展到 30,000 個并發用戶的 5 條 Rockin'Tips
- Twitter 的架構用于在 5 秒內處理 1.5 億活躍用戶,300K QPS,22 MB / S Firehose 以及發送推文
- Salesforce Architecture-他們每天如何處理 13 億筆交易
- 擴大流量的設計決策
- ESPN 的架構規模-每秒以 100,000 Duh Nuh Nuhs 運行
- 如何制作無限可擴展的關系數據庫管理系統(RDBMS)
- Bazaarvoice 的架構每月發展到 500M 唯一用戶
- HipChat 如何使用 ElasticSearch 和 Redis 存儲和索引數十億條消息
- NYTimes 架構:無頭,無主控,無單點故障
- 接下來的大型聲音如何使用 Hadoop 數據版本控制系統跟蹤萬億首歌曲的播放,喜歡和更多內容
- Google 如何備份 Internet 和數十億字節的其他數據
- 從 HackerEarth 用 Apache 擴展 Python 和 Django 的 13 個簡單技巧
- AOL.com 體系結構如何發展到 99.999%的可用性,每天 800 萬的訪問者和每秒 200,000 個請求
- Facebook 以 190 億美元的價格收購了 WhatsApp 體系結構
- 使用 AWS,Scala,Akka,Play,MongoDB 和 Elasticsearch 構建社交音樂服務
- 大,小,熱還是冷-條帶,Tapad,Etsy 和 Square 的健壯數據管道示例
- WhatsApp 如何每秒吸引近 5 億用戶,11,000 內核和 7,000 萬條消息
- Disqus 如何以每秒 165K 的消息和小于 0.2 秒的延遲進行實時處理
- 關于 Disqus 的更新:它仍然是實時的,但是 Go 摧毀了 Python
- 關于 Wayback 機器如何在銀河系中存儲比明星更多的頁面的簡短說明
- 在 PagerDuty 遷移到 EC2 中的 XtraDB 群集
- 擴展世界杯-Gambify 如何與 2 人組成的團隊一起運行大型移動投注應用程序
- 一點點:建立一個可處理每月 60 億次點擊的分布式系統的經驗教訓
- StackOverflow 更新:一個月有 5.6 億次網頁瀏覽,25 臺服務器,而這一切都與性能有關
- Tumblr:哈希處理每秒 23,000 個博客請求的方式
- 使用 HAProxy,PHP,Redis 和 MySQL 處理 10 億個請求的簡便方法來構建成長型啟動架構
- MixRadio 體系結構-兼顧各種服務
- Twitter 如何使用 Redis 進行擴展-105TB RAM,39MM QPS,10,000 多個實例
- 正確處理事情:通過即時重放查看集中式系統與分散式系統
- Instagram 提高了其應用程序的性能。 這是如何做。
- Clay.io 如何使用 AWS,Docker,HAProxy 和 Lots 建立其 10 倍架構
- 英雄聯盟如何將聊天擴大到 7000 萬玩家-需要很多小兵。
- Wix 的 Nifty Architecture 技巧-大規模構建發布平臺
- Aeron:我們真的需要另一個消息傳遞系統嗎?
- 機器:惠普基于憶阻器的新型數據中心規模計算機-一切仍在變化
- AWS 的驚人規模及其對云的未來意味著什么
- Vinted 體系結構:每天部署數百次,以保持繁忙的門戶穩定
- 將 Kim Kardashian 擴展到 1 億個頁面
- HappyPancake:建立簡單可擴展基金會的回顧
- 阿爾及利亞分布式搜索網絡的體系結構
- AppLovin:通過每天處理 300 億個請求向全球移動消費者進行營銷
- Swiftype 如何以及為何從 EC2 遷移到真實硬件
- 我們如何擴展 VividCortex 的后端系統
- Appknox 架構-從 AWS 切換到 Google Cloud
- 阿爾及利亞通往全球 API 的憤怒之路
- 阿爾及利亞通往全球 API 步驟的憤怒之路第 2 部分
- 為社交產品設計后端
- 阿爾及利亞通往全球 API 第 3 部分的憤怒之路
- Google 如何創造只有他們才能創造的驚人的數據中心網絡
- Autodesk 如何在 Mesos 上實施可擴展事件
- 構建全球分布式,關鍵任務應用程序:Trenches 部分的經驗教訓 1
- 構建全球分布式,關鍵任務應用程序:Trenches 第 2 部分的經驗教訓
- 需要物聯網嗎? 這是美國一家主要公用事業公司從 550 萬米以上收集電力數據的方式
- Uber 如何擴展其實時市場平臺
- 優步變得非常規:使用司機電話作為備份數據中心
- 在不到五分鐘的時間里,Facebook 如何告訴您的朋友您在災難中很安全
- Zappos 的網站與 Amazon 集成后凍結了兩年
- 為在現代時代構建可擴展的有狀態服務提供依據
- 細分:使用 Docker,ECS 和 Terraform 重建基礎架構
- 十年 IT 失敗的五個教訓
- Shopify 如何擴展以處理來自 Kanye West 和 Superbowl 的 Flash 銷售
- 整個 Netflix 堆棧的 360 度視圖
- Wistia 如何每小時處理數百萬個請求并處理豐富的視頻分析
- Google 和 eBay 關于構建微服務生態系統的深刻教訓
- 無服務器啟動-服務器崩潰!
- 在 Amazon AWS 上擴展至 1100 萬以上用戶的入門指南
- 為 David Guetta 建立無限可擴展的在線錄制活動
- Tinder:最大的推薦引擎之一如何決定您接下來會看到誰?
- 如何使用微服務建立財產管理系統集成
- Egnyte 體系結構:構建和擴展多 PB 分布式系統的經驗教訓
- Zapier 如何自動化數十億個工作流自動化任務的旅程
- Jeff Dean 在 Google 進行大規模深度學習
- 如今 Etsy 的架構是什么樣的?
- 我們如何在 Mail.Ru Cloud 中實現視頻播放器
- Twitter 如何每秒處理 3,000 張圖像
- 每天可處理數百萬個請求的圖像優化技術
- Facebook 如何向 80 萬同時觀看者直播
- Google 如何針對行星級基礎設施進行行星級工程設計?
- 為 Mail.Ru Group 的電子郵件服務實施反垃圾郵件的貓捉老鼠的故事,以及 Tarantool 與此相關的內容
- The Dollar Shave Club Architecture Unilever 以 10 億美元的價格被收購
- Uber 如何使用 Mesos 和 Cassandra 跨多個數據中心每秒管理一百萬個寫入
- 從將 Uber 擴展到 2000 名工程師,1000 個服務和 8000 個 Git 存儲庫獲得的經驗教訓
- QuickBooks 平臺
- 美國大選期間城市飛艇如何擴展到 25 億個通知
- Probot 的體系結構-我的 Slack 和 Messenger Bot 用于回答問題
- AdStage 從 Heroku 遷移到 AWS
- 為何將 Morningstar 遷移到云端:降低 97%的成本
- ButterCMS 體系結構:關鍵任務 API 每月可處理數百萬個請求
- Netflix:按下 Play 會發生什么?
- ipdata 如何以每月 150 美元的價格為來自 10 個無限擴展的全球端點的 2500 萬個 API 調用提供服務
- 每天為 1000 億個事件賦予意義-Teads 的 Analytics(分析)管道
- Auth0 體系結構:在多個云提供商和地區中運行
- 從裸機到 Kubernetes
- Egnyte Architecture:構建和擴展多 PB 內容平臺的經驗教訓
- 縮放原理
- TripleLift 如何建立 Adtech 數據管道每天處理數十億個事件
- Tinder:最大的推薦引擎之一如何決定您接下來會看到誰?
- 如何使用微服務建立財產管理系統集成
- Egnyte 體系結構:構建和擴展多 PB 分布式系統的經驗教訓
- Zapier 如何自動化數十億個工作流自動化任務的旅程
- Jeff Dean 在 Google 進行大規模深度學習
- 如今 Etsy 的架構是什么樣的?
- 我們如何在 Mail.Ru Cloud 中實現視頻播放器
- Twitter 如何每秒處理 3,000 張圖像
- 每天可處理數百萬個請求的圖像優化技術
- Facebook 如何向 80 萬同時觀看者直播
- Google 如何針對行星級基礎設施進行行星級工程設計?
- 為 Mail.Ru Group 的電子郵件服務實施反垃圾郵件的貓捉老鼠的故事,以及 Tarantool 與此相關的內容
- The Dollar Shave Club Architecture Unilever 以 10 億美元的價格被收購
- Uber 如何使用 Mesos 和 Cassandra 跨多個數據中心每秒管理一百萬個寫入
- 從將 Uber 擴展到 2000 名工程師,1000 個服務和 8000 個 Git 存儲庫獲得的經驗教訓
- QuickBooks 平臺
- 美國大選期間城市飛艇如何擴展到 25 億條通知
- Probot 的體系結構-我的 Slack 和 Messenger Bot 用于回答問題
- AdStage 從 Heroku 遷移到 AWS
- 為何將 Morningstar 遷移到云端:降低 97%的成本
- ButterCMS 體系結構:關鍵任務 API 每月可處理數百萬個請求
- Netflix:按下 Play 會發生什么?
- ipdata 如何以每月 150 美元的價格為來自 10 個無限擴展的全球端點的 2500 萬個 API 調用提供服務
- 每天為 1000 億個事件賦予意義-Teads 的 Analytics(分析)管道
- Auth0 體系結構:在多個云提供商和地區中運行
- 從裸機到 Kubernetes
- Egnyte Architecture:構建和擴展多 PB 內容平臺的經驗教訓