# Uber 如何擴展其實時市場平臺
> 原文: [http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html](http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html)

據報道,[優步](https://www.uber.com/)在短短四年中增長了驚人的 [38 倍。 現在,我認為這是第一次,Uber 首席系統架構師](http://www.latimes.com/business/la-fi-0822-uber-revenue-20150822-story.html) [Matt Ranney](https://twitter.com/mranney) 在一個非常有趣且詳細的演講中-[擴展 Uber 的實時市場平臺](http://www.infoq.com/presentations/uber-market-platform)- 告訴我們有關 Uber 軟件如何工作的很多信息。
如果您對 Surge 定價感興趣,則不在討論之列。 我們確實了解了 Uber 的調度系統,如何實現地理空間索引,如何擴展系統,如何實現高可用性以及如何處理故障,包括使用驅動程序電話作為外部分布式存儲系統來處理數據中心故障的驚人方式。 復蘇。
演講的整體印象是非常快速的增長之一。 他們做出的許多架構選擇都是由于快速發展并試圖授權最近組建的團隊盡快行動而造成的。 后端已經使用了許多技術,因為他們的主要目標是使團隊盡可能快地提高工程速度。
在一個可以理解的混亂(非常成功)的開始之后,Uber 似乎已經學到了很多關于他們的業務以及他們真正需要成功的知識。 他們的早期派遣系統是一個典型的使其工作正常的事情,在更深的層次上假設它僅在移動人員。 現在,Uber 的使命已經發展為可以處理箱子,雜貨以及人員,他們的調度系統已經抽象出來,并奠定了非常堅實和智能的架構基礎。
盡管馬特(Matt)認為他們的體系結構可能有點瘋狂,但是在他們的用例中似乎使用了帶有八卦協議的一致哈希環的想法。
很難不為 Matt 對工作的真正熱情著迷。 在談到 DISCO,即他們的調度系統時,他激動地說道,這就像是學校里的旅行推銷員問題。 這是很酷的計算機科學。 即使解決方案不是最佳解決方案,但它還是由在容錯范圍內的可擴展組件構建的,實時,真實的規模實用的旅行推銷員。 多么酷啊?
因此,讓我們看看 Uber 在內部的工作方式。 這是我對 Matt [演講](http://www.infoq.com/presentations/uber-market-platform) 的演講:
## 統計信息
* Uber 地理空間指數的目標是每秒寫入一百萬次。 閱讀的倍數。
* 調度系統具有數千個節點。
## 平臺
* Node.js
* Python
* Java
* 轉到
* iOS 和 Android 上的本機應用程序
* 微服務
* Redis
* Postgres
* MySQL
* [修復](http://basho.com/)
* Twitter 的 Redis 的 [Twemproxy](https://github.com/twitter/twemproxy)
* Google 的 [S2 幾何庫](https://code.google.com/p/s2-geometry-library/)
* [鈴聲](https://github.com/uber/ringpop-node) -一致的哈希環
* [TChannel](https://github.com/uber/tchannel) -RPC 的網絡復用和成幀協議
* 節儉
## 常規
* Uber 是一個運輸平臺,用于將騎手與駕駛員伙伴聯系起來。
* 挑戰:**將動態需求與動態供應實時匹配**。 在供應方,駕駛員可以自由地做他們想做的任何事情。 在需求方,騎手需要時隨時需要運輸。
* Uber 的 Dispatch 系統是一個實時市場平臺,可使用手機將駕駛員與騎手相匹配。
* 除夕是 Uber 一年中最繁忙的時間。
* 容易忘記該行業取得如此巨大進步的速度。 技術的發展是如此之快,以至于最近令人驚奇的事物很快就消失了。 二十三年前,手機,互聯網和 GPS 只是科幻小說,而現在我們幾乎沒有注意到它。
## 體系結構概述
* 驅動這一切的是運行本機應用程序的手機上的騎手和駕駛員。
* 后端主要為手機流量提供服務。 客戶通過移動數據和盡力而為的 Internet 與后端對話。 您能想象 10 年前基于移動數據開展業務嗎? 我們現在可以做這種事情真是太棒了。 沒有使用專用網絡,沒有花哨的 QoS(服務質量),只有開放的 Internet。
* 客戶連接到與駕駛員和騎手相匹配的調度系統,供需。
* Dispatch 幾乎完全用 node.js 編寫。
* 計劃將其移至 [io.js](https://iojs.org/en/index.html) ,但是從那時起,io.js 和 node.js [已合并](http://www.infoworld.com/article/2923081/javascript/reunited-io-js-rejoins-with-node-js.html) 。
* 您可以使用 javascript 做有趣的分布式系統。
* 很難低估**的生產能力,而節點開發人員**非常熱情。 他們可以很快完成很多工作。
* 整個 Uber 系統似乎非常簡單。 為什么您需要所有這些子系統以及所有這些人? 只要這樣,那便是成功的標志。 有很多事情要做,只要看起來很簡單,他們就完成了自己的工作。
* **地圖/ ETA** (預計到達時間)。 為了使 Dispatch 做出明智的選擇,必須獲取地圖和路線信息。
* 街道地圖和歷史旅行時間用于估計當前旅行時間。
* 語言在很大程度上取決于要與哪個系統集成。 因此,有 Python,C ++和 Java
* **服務**。 有大量的業務邏輯服務。
* 使用微服務方法。
* 主要用 Python 編寫。
* **數據庫**。 使用了許多不同的數據庫。
* 最古老的系統是用 Postgres 編寫的。
* Redis 經常使用。 有些落后于 Twemproxy。 有些是自定義群集系統的背后。
* MySQL
* Uber 正在建立自己的分布式列存儲,該存儲可編排一堆 MySQL 實例。
* 某些分派服務在 Riak 中保持狀態。
* **行程后管道**。 旅行結束后必須進行很多處理。
* 收集評分。
* 發送電子郵件。
* 更新數據庫。
* 安排付款。
* 用 Python 編寫。
* **金錢**。 Uber 與許多支付系統集成。
## 舊派送系統
* 最初的 Dispatch 系統的局限性是**開始限制公司**的成長,因此必須進行更改。
* 盡管 [Joel Spolsky 說了](http://www.joelonsoftware.com/articles/fog0000000069.html) ,但大部分內容還是重寫了整個內容。 其他所有系統都沒有被觸及,甚至 Dispatch 系統中的某些服務都得以幸存。
* 舊系統是為私人交通設計的,它有很多假設:
* 每輛車一個車手,不適用于 [Uber Pool](https://get.uber.com/cl/uberpool/) 。
* 遷移人員的想法已深入到數據模型和接口中。 這限制了向新市場和新產品的轉移,例如轉移食品和盒子。
* 原始版本由城市分片。 這對可伸縮性很有好處,因為每個城市都可以獨立運行。 但是,隨著越來越多的城市被添加,它變得越來越難以管理。 有些城市很大,有些城市很小。 一些城市的負載高峰很大,而其他城市則沒有。
* 由于構建速度如此之快,它們沒有單點故障,所以它們有多點故障。
## 新派送系統
* 為了解決城市分片問題并支持更多產品的問題,必須將供求的概念推廣起來,因此創建了**供應服務和需求服務**。
* 供應服務跟蹤所有供應的功能和狀態機。
* 要跟蹤車輛,有許多屬性可以模型化:座椅數量,車輛類型,兒童汽車座椅的存在,輪椅是否可以安裝等。
* 需要跟蹤分配。 例如,一輛汽車可能有三個座位,但其中兩個就被占用了。
* 需求服務跟蹤需求,訂單以及需求的所有方面。
* 如果騎乘者需要汽車安全座椅,則該要求必須與庫存相匹配。
* 如果車手不介意以便宜的價格共享汽車,則必須建模。
* 如果需要移動箱子或運送食物怎么辦?
* 滿足所有供求關系的邏輯是稱為 DISCO(調度優化)的服務。
* 舊系統將僅在當前可用供應量上匹配,這意味著正在等待工作的道路上的汽車。
* DISCO 支持對未來進行規劃,并在可用信息時加以利用。 例如,修改正在進行的行程中的路線。
* **按供應商**的地理位置。 DISCO 需要地理空間索引來根據所有供應的位置和預期的位置來做出決策。
* **按需求分配地理位置**。 需求還需要地理索引
* 需要更好的路由引擎來利用所有這些信息。
### 調度
* 當車輛四處行駛時,位置更新將通過供應發送到地理位置。 為了使駕駛員與駕駛員匹配或僅在地圖上顯示汽車,DISCO 通過供應向地理區域發送請求。
* 按供應商的地理位置會制作一個粗糙的首過濾波器,以獲取附近符合要求的候選對象。
* 然后,將清單和需求發送到路由/ ETA,以計算它們在地理上而不是在道路系統附近的距離的 ETA。
* 按 ETA 排序,然后將其發送回供應源,以提供給駕駛員。
* 在機場,他們必須模擬虛擬出租車隊列。 必須將供應排隊,以考慮到貨的順序。
### 地理空間索引
* 必須具有超級可擴展性。 設計目標是**每秒處理一百萬次寫入**。 寫入速率來自于驅動程序,驅動程序在移動時每 4 秒發送一次更新。
* 讀取目標是每秒讀取的次數多于每秒寫入的次數,因為每個打開應用程序的人都在進行讀取。
* 通過簡化假設,舊的地理空間指數非常有效,它僅跟蹤可調度的供應。 供應的大部分都在忙于做某事,因此可用供應的子集易于支持。 在少數幾個進程中,全局索引存儲在內存中。 進行非常幼稚的匹配非常容易。
* 在新世界**中,必須跟蹤每個狀態下的所有供應**。 此外,還必須跟蹤其預計路線。 這是更多的數據。
* 新服務**在數百個進程**上運行。
* 地球是一個球體。 單純基于經度和緯度很難進行匯總和近似。 因此,Uber 使用 Google S2 庫將地球分成了微小的單元。 每個單元都有唯一的單元 ID。
* 使用 int64 可以表示地球上每平方厘米。 Uber 會使用 12 級的單元,其大小從 3.31 km(2)到 6.38 km(2),具體取決于您在地球上的哪個位置。 盒子根據它們在球體上的位置而改變形狀和大小。
* S2 可以提供形狀的覆蓋范圍。 如果要繪制一個以倫敦為中心,半徑為 1 公里的圓,S2 可以告訴您需要哪些單元格才能完全覆蓋該形狀。
* 由于每個單元都有一個 ID,因此該 ID 被用作分片密鑰。 當從供應中獲得位置時,將確定該位置的小區 ID。 使用單元 ID 作為分片鍵,可以更新耗材的位置。 然后將其發送到幾個副本。
* 當 DISCO 需要在某個地點附近尋找補給品時,將以騎手所在的位置為中心,計算一個圓的覆蓋范圍。 使用圓圈區域中的單元 ID,將所有相關的分片聯系起來以返回供應數據。
* 全部可擴展。 即使效率不如您期望的那樣,并且由于扇出相對便宜,所以可以始終通過添加更多節點來擴展寫負載。 通過使用副本來縮放讀取負載。 如果需要更多的讀取容量,則可以增加復制因子。
* 一個限制是單元格大小固定為 12 級大小。 將來可能會支持動態單元大小。 需要進行權衡,因為像元大小越小,查詢的扇出越大。
### 路由
* 從地理空間得到答案后,必須對選項進行排名。
* 有幾個高級目標:
* **減少額外的驅動**。 駕駛是人們的工作,因此人們渴望提高生產力。 他們獲得額外的出行報酬。 理想情況下,駕駛員應連續行駛。 一堆工作會排隊等待,他們將為此獲得報酬。
* **減少等待**。 騎手應等待的時間盡可能短。
* **總體 ETA 最低**。
* 舊的系統是讓需求搜索當前可用的供應,匹配并完成。 它易于實施且易于理解。 對于私人交通來說,它工作得很好。
* 僅查看當前的可用性無法做出好的選擇。
* 的想法是,與正在遠處行駛的駕駛員相比,當前正在運送駕駛員的駕駛員可能更適合要求乘車的顧客。 挑選出行駕駛員可以最大程度地減少客戶的等待時間,并可以減少遠程駕駛員的額外駕駛時間。
* 這種嘗試展望未來的模型可以更好地處理動態條件。
* 例如,如果某個駕駛員在客戶附近上線,但已經從較遠的地方派遣了另一個駕駛員,則無法更改分配決策。
* 另一個示例涉及愿意共享旅程的客戶。 通過嘗試在非常復雜的場景中預測未來,可以進行更多優化。
* 在考慮運送盒子或食物時,所有這些決定變得更加有趣。 在這些情況下,人們通常還有其他事情要做,因此涉及不同的權衡。
## 縮放調度
* 使用 node.js 構建調度程序。
* 他們正在建立有狀態服務,因此無狀態擴展方法將行不通。
* Node 在單個進程中運行,因此必須設計某種方法以在同一臺計算機上的多個 CPU 上以及多個計算機上運行 Node。
* 有一個關于在 Javascript 中重新實現所有 Erlang 的笑話。
* 用于擴展 Node 的解決方案是 *ringpop* ,這是一種具有八卦協議的一致哈希環,實現了可擴展的,容錯的應用程序層分片。
* 在 CAP 術語中,ringpop 是 **AP 系統**,為了獲得可用性而進行交易。 最好說明一些不一致之處,而不是提供停機服務。 最好起床并偶爾出錯。
* 鈴聲是每個 Node 進程中都包含的可嵌入模塊。
* 節點實例在成員資格集周圍閑聊。 一旦所有節點都同意誰是誰,他們就可以獨立有效地做出查找和轉發決策。
* 這確實是可擴展的。 添加更多流程,完成更多工作。 它可用于分片數據,或用作分布式鎖定系統,或協調 pub / sub 或長輪詢套接字的集合點。
* 八卦協議基于 [SWIM](https://www.cs.cornell.edu/~asdas/research/dsn02-swim.pdf) 。 已經進行了一些改進以縮短收斂時間。
* 閑聊的成員列表隨處可見。 隨著添加更多節點,它是可伸縮的。 SWIM 中的“ S”是可擴展的,確實有效。 到目前為止,**已擴展到數千個節點。**
* SWIM 將健康檢查與成員身份更改結合在一起,作為同一協議的一部分。
* 在鈴聲系統中,所有這些 Node 進程都包含鈴聲模塊。 他們八卦當前成員。
* 在外部,如果 DISCO 要消耗地理空間,則每個節點都是等效的。 選擇一個隨機的健康節點。 請求到達的任何地方都負責使用哈希環查找將請求轉發到正確的節點。 看起來像:

* 使所有這些躍點和對等體互相交談可能聽起來很瘋狂,但是它會產生一些非常好的屬性,例如可以通過在任何計算機上添加實例來擴展服務。
* ringpop 是基于 Uber 自己的稱為 *TChannel* 的 RPC 機制構建的。
* 這是一個雙向請求/響應協議,其靈感來自 Twitter 的 [Finagle](https://twitter.github.io/finagle/) 。
* 一個重要的目標是控制許多不同語言的性能。 特別是在 Node 和 Python 中,許多現有的 RPC 機制無法很好地發揮作用。 想要 redis 級性能。 **TChannel 已經比 HTTP** 快 20 倍。
* 想要高性能的轉發路徑,以便中間人可以非常輕松地做出轉發決策,而不必了解完整的有效負載。
* 希望進行適當的流水線處理,以免出現線頭阻塞,請求和響應可以隨時沿任一方向發送,并且每個客戶端也是一臺服務器。
* 希望引入有效負載校驗和和跟蹤以及一流的功能。 每個請求遍歷系統時都應該是可跟蹤的。
* 想要從 HTTP 清除遷移路徑。 HTTP 可以非常自然地封裝在 TChannel 中。
* **Uber 退出了 HTTP 和 Json 業務**。 一切都在通過 TChannel 進行節儉。
* 鈴聲正在通過基于 TChannel 的持久連接進行所有八卦。 這些相同的持久連接用于扇出或轉發應用程序流量。 TChannel 也用于服務之間的通話。
## 派送可用性
* **可用性很重要**。 優步擁有競爭對手,轉換成本非常低。 如果 Uber 暫時倒閉,那筆錢就會流向其他人。 其他產品的粘性更大,客戶稍后會再試。 Uber 不一定是這樣。
* **使所有內容均可重試**。 如果某些操作無效,則必須重試。 這就是解決故障的方法。 這要求所有請求都是冪等的。 例如,重試發送不能將它們發送兩次或對某人的信用卡收取兩次費用。
* **使所有東西都可以殺死**。 失敗是常見的情況。 隨機殺死進程不應造成損害。
* **僅崩潰**。 沒有正常關機。 正常關機不是必需的做法。 當意外情況發生時,需要練習。
* **小塊**。 為了最大程度地減少失敗帶來的損失,請將它們分成更小的部分。 可能可以在一個實例中處理全局流量,但是當該流量消失時會發生什么呢? 如果有一對,但其中一個發生故障,則容量將減少一半。 因此,服務需要分解。 聽起來像是技術問題,但更多是文化問題。 擁有一對數據庫會更容易。 這是很自然的事情,但是配對不好。 如果您能夠自動升級一個并重新啟動新的輔助節點,則隨機殺死它們是非常危險的。
* **殺死所有東西**。 甚至殺死所有數據庫,以確保有可能幸免于此類失敗。 這就需要改變使用哪種數據庫的決策,他們選擇了 Riak 而不是 MySQL。 這也意味著使用鈴聲而不是 redis。 殺死 redis 實例是一項昂貴的操作,通常,刪除它們的規模很大而且代價很高。
* **將其分解為較小的塊**。 談論文化轉變。 通常,服務 A 將通過負載平衡器與服務 B 對話。 如果負載均衡器死了怎么辦? 您將如何處理? 如果您從不走那條路,那您將永遠不會知道。 因此,您必須終止負載均衡器。 您如何繞過負載均衡器? 負載平衡邏輯必須放在服務本身中。 客戶需要具有一定的智能才能知道如何解決問題。 這在哲學上類似于 Finagle 的工作方式。
* 為了使整個系統擴展并處理背壓,已經從一系列的 poppop 節點中創建了一個服務發現和路由系統。
## 總數據中心故障
* 這種情況很少發生,但是可能會發生意外的級聯故障,或者上游網絡提供商可能會發生故障。
* Uber 維護著一個備份數據中心,并安裝了交換機以將所有內容路由到備份數據中心。
* 問題是進程內旅行的數據可能不在備份數據中心中。 他們不是使用復制數據,而是使用駕駛員電話作為行程數據的來源。
* 發生的情況是調度系統**定期向驅動器電話**發送加密的狀態摘要。 現在,假設有一個數據中心故障轉移。 下次駕駛員電話向 Dispatch 系統發送位置更新時,Dispatch 系統將檢測到該行程不知道,并向州政府索要狀態摘要。 然后,派遣系統會根據狀態摘要進行自我更新,并且旅行就像沒有發生一樣繼續進行。
## 不利之處
* Uber 解決可擴展性和可用性問題的方法的弊端是潛在的高延遲,因為 Node 進程之間相互轉發請求并發送扇出的消息。
* 在扇出系統中,微小的斑點和毛刺會產生驚人的巨大影響。 系統中的扇出程度越高,發生高延遲請求的機會就越大。
* 一個好的解決方案是通過跨服務器取消來擁有**備份請求。 這是 TChannel 的一流功能。 將請求與信息一起發送到服務 B(2)的請求一起發送到服務 B(1)。 然后,稍后將請求發送到服務 B(2)。 B(1)完成請求后,將取消 B(2)上的請求。 有了延遲,這意味著在通常情況下 B(2)沒有執行任何工作。 但是,如果 B(1)確實失敗了,那么 B(2)將處理該請求并以比首先嘗試 B(1),發生超時然后再嘗試 B(2)更低的延遲返回響應。**
* 請參見 [Google 延遲容忍系統:將不可預測的部分](http://highscalability.com/blog/2012/6/18/google-on-latency-tolerant-systems-making-a-predictable-whol.html) 制成可預測的整體,以獲取更多背景知識。
## 相關文章
* [關于 HackerNews](https://news.ycombinator.com/item?id=10216019)
* [S2map.com](http://s2map.com/) -請參見 S2 覆蓋率和繪制形狀
感謝您寫這篇文章。 令人著迷的閱讀!
很棒的文章,非常有趣,并深入研究@uber 工作中的思想過程。
- 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 內容平臺的經驗教訓