# Vinted 體系結構:每天部署數百次,以保持繁忙的門戶穩定
> 原文: [http://highscalability.com/blog/2015/2/9/vinted-architecture-keeping-a-busy-portal-stable-by-deployin.html](http://highscalability.com/blog/2015/2/9/vinted-architecture-keeping-a-busy-portal-stable-by-deployin.html)

*這是 [Vinted](https://www.vinted.com/) 的 [NerijusBend?iūnas](https://www.linkedin.com/profile/view?id=48589106)和 [Tomas Varaneckas](https://twitter.com/spajus) 的來賓帖子。*
[Vinted](https://www.vinted.com/) 是一個對等市場,用于出售,購買和交換衣服。 它允許成員直接通信,并具有社交網絡服務的功能。
它始于 2008 年,最初是一個立陶宛女孩的小社區,后來發展成為一個全球性項目,為 8 個不同國家/地區的 700 萬用戶提供服務,并且這一需求正在不斷增長,每天處理超過 2 億個請求。
## 統計資料
* 700 萬用戶,并且還在不斷增長
* 每月 250 萬活躍用戶
* 每天 2 億個請求(瀏覽量+ API 調用)
* 9.3 億張照片
* 80 TB 原始空間用于圖像存儲
* 60 TB HDFS 原始空間用于分析數據
* 70%的流量來自移動應用(API 請求)
* 每位成員每周花費 3 個小時以上的時間
* 2500 萬個上市項目
* 超過 220 臺服務器:
* 47 用于內部工具(vpn,廚師,監視,開發,制圖,構建,備份等)
* Hadoop 生態系統 38
* 34 用于圖像處理和存儲
* 獨角獸和微服務 30
* 28 個用于 MySQL 數據庫,包括副本
* 19 用于獅身人面像搜索
* 10 個用于背景工作
* 10 用于使用 Nginx 進行負載平衡
* 卡夫卡 6
* Redis 4
* 4 用于電子郵件傳遞
## 技術棧
### 第三方服務
* [GitHub](https://github.com/) ,用于代碼,問題和討論
* [NewRelic](http://newrelic.com/) 用于監視應用程序響應時間
* [CloudFlare](https://www.cloudflare.com/) 用于 DDoS 保護和 DNS
* [Amazon Web Services](http://aws.amazon.com/) (SES,Glacier),用于通知和長期備份
* [閑暇](https://slack.com/)用于工作對話和“聊天操作”
* [Trello](https://trello.com/) 完成任務
* [Pingdom](http://pingdom.com/) 用于正常運行時間監控
### 核心應用和服務
* [Ruby](https://www.ruby-lang.org/) 用于服務,腳本和主應用
* [主應用程序和內部應用程序的 Rails](http://rubyonrails.org/)
* [獨角獸](http://unicorn.bogomips.org/)服務于主應用
* [Percona MySQL 服務器](http://www.percona.com/software/percona-server/ps-5.6)作為主數據庫
* [Sphinx 搜索](http://sphinxsearch.com/)用于全文搜索并減少 MySQL 的負載(測試 [ElasticSearch](http://www.elasticsearch.org/) )
* [Capistrano](http://capistranorb.com/) 用于部署
* [Jenkins](http://jenkins-ci.org/) 用于運行測試,部署和其他各種任務
* [Memcached](http://memcached.org/) 用于緩存
* [請求](http://resquework.org/)進行后臺作業
* [Redis](http://redis.io/) 用于 Resque 和 Feed
* [RabbitMQ](http://www.rabbitmq.com/) 用于將消息傳遞到服務
* [HAproxy](http://www.haproxy.org/) 提供高可用性和負載平衡
* [GlusterFS](http://www.gluster.org/) 用于分布式存儲
* [Nginx](http://nginx.org/) 投放 Web 請求
* [Apache Zookeeper](http://zookeeper.apache.org/) 用于分布式鎖定
* [Flashcache](https://github.com/facebook/flashcache/) 可提高 I / O 吞吐量
### 數據倉庫堆棧
* [Clojure](http://clojure.org/) 用于數據提取服務
* [Apache Kafka](http://kafka.apache.org/) ,用于存儲飛行中的數據
* [Camus](https://github.com/linkedin/camus) 用于將數據從 Kafka 卸載到 HDFS
* [Apache Hive](https://hive.apache.org/) 作為 SQL-on-Hadoop 解決方案
* [Cloudera CDH](http://www.cloudera.com/content/cloudera/en/products-and-services/cdh.html) Hadoop 發行版
* [Cloudera Impala](http://www.cloudera.com/content/cloudera/en/products-and-services/cdh/impala.html) 作為低延遲 SQL-on-Hadoop 解決方案
* [Apache Spark](https://spark.apache.org/) 處于實驗階段
* [Apache Oozie](http://oozie.apache.org/) 作為工作流調度程序(研究替代方案)
* [擴展](https://github.com/twitter/scalding)用于數據轉換
* [Avro](http://avro.apache.org/) 用于數據序列化
* [Apache Parquet](http://parquet.incubator.apache.org/) 用于數據序列化
### 服務器和資源調配
* 多為裸金屬
* 多個數據中心
* [CentOS](http://www.centos.org/)
* [廚師](https://www.chef.io/)用于配置幾乎所有內容
* [Berkshelf](http://berkshelf.com/) ,用于管理 Chef 依賴項
* [測試廚房](http://kitchen.ci/),用于在 VM 上運行基礎結構測試
* [Ansible](http://www.ansible.com/) 用于滾動升級
### 監控方式
* [Nagios](http://www.nagios.org/) 用于常規操作監控
* [仙人掌](http://www.cacti.net/)用于圖形和容量規劃
* [Graylog2](https://www.graylog2.org/) 適用于應用程序日志
* 用于服務器日志的 [Logstash](http://logstash.net/)
* [Kibana](http://www.elasticsearch.org/overview/kibana/) 用于查詢 logstash
* [統計信息](https://github.com/etsy/statsd),用于從應用程序收集實時指標
* [石墨](http://graphite.wikidot.com/),用于存儲應用程序中的實時指標
* [Grafana](http://grafana.org/) 用于創建帶有應用指標的精美儀表板
* [集線器](https://hubot.github.com/)用于基于聊天的監視
## 架構概述
* 裸機服務器被用作云提供商的更便宜,更強大的替代產品。
* 在歐洲和美國的 3 個不同數據中心托管服務器。
* Nginx 前端將 HTTP 請求路由到獨角獸工作者并執行 SSL 終止。
* [Pacemaker](http://clusterlabs.org/) 用于確保 Nginx 服務器的高可用性。
* 在不同的國家/地區,每個 Vinted 門戶網站都有自己單獨的部署和資源集。
* 為了提高機器利用率,屬于多個門戶的大多數服務可以在單個裸機服務器上彼此并行運行。 主廚配方負責唯一的端口分配和其他分離問題。
* 通過為每個門戶網站使用單獨的數據庫來避免 MySQL 分片。
* 在我們最大的門戶中,功能性分片已經在發生,距離單個最大表無法容納在服務器中的點還差幾個月。
* Rails 應用程序中的緩存使用帶有 L2 緩存的自定義機制,可以防止主緩存過期時出現峰值。 使用了幾種緩存策略:
* 遠程(在 memcached 中)
* 本地(在獨角獸工作者的記憶中)
* 半本地(在獨角獸工作器內存中,當本地緩存到期時回退到 memcached)。
* 圍繞核心 Rails 應用程序構建了幾個微服務,它們都有明確的用途,例如發送 iOS 推送通知,存儲和提供品牌名稱,存儲和提供標簽。
* 微服務可以是按端口,按數據中心或全局的。
* 每個微服務的多個實例正在運行以實現高可用性。
* Nginx 平衡了基于 HTTP 的微服務。
* 使用 Redis 實現每個成員的自定義 feed。
* 使用過濾器(自定義大小,顏色等)時,從 Sphinx 索引而不是 MySQL 加載目錄頁面。
* 圖像由單獨的 Rails 應用處理。
* 處理后的圖像存儲在 GlusterFS 中。
* 第 3 次匹配后會緩存圖片,因為前幾次匹配通常來自上傳者,并且圖片可能會旋轉。
* 使用 [twemproxy](https://github.com/twitter/twemproxy) 分割 Memcached 實例。
## 球隊
* 超過 150 名全職員工
* 30 位開發人員(后端,前端,移動)
* 5 名現場可靠性工程師
* 立陶宛維爾紐斯的總部
* 在美國,德國,法國,捷克共和國和波蘭設有辦事處
## 公司的運作方式
* 幾乎所有信息對所有員工開放
* 使用 GitHub 進行幾乎所有操作(包括討論公司問題)
* Slack 中的實時討論
* 每個人都可以自由參加他們感興趣的事情
* 自治隊
* 沒有資歷等級
* 跨職能開發團隊
* 沒有強制執行的流程,團隊可以決定如何管理自己
* 團隊致力于解決高層問題,并決定如何解決它們
* 每個團隊都決定如何,何時何地工作
* 團隊在需要時自行雇用
## 開發周期
* 開發人員從主人處分支。
* 更改成為 GitHub 中的請求請求。
* Jenkins 運行 [Pronto](https://github.com/mmozuras/pronto) 進行靜態代碼和樣式檢查,在 pull request 分支上運行所有測試,并使用狀態更新 GitHub pull request。
* 其他開發人員查看更改,添加評論。
* 拉取請求可能會使用各種修復程序多次更新。
* 每次更新后,Jenkins 都會運行所有測試。
* 在與 master 合并之前清理 Git 歷史,以保持 master 歷史的簡潔性。
* 接受的請求請求將合并到主服務器中。
* Jenkins 使用所有測試運行主版本,并觸發部署作業以推出新版本。
* 幾分鐘后,代碼到達 master 分支后,將其應用于生產中。
* 拉取請求通常很小。
* 每天部署約 300 次。
## 避免失敗
每天部署數百次并不意味著總是必須破壞所有東西,但是保持站點穩定需要一定的紀律。
* 如果測試失敗,則不會進行部署。 沒有方法可以覆蓋它,母版必須為綠色才能進行部署。
* 每天晚上和周末自動部署鎖定。
* 任何人都可以通過 Slack 聊天手動鎖定部署。
* 部署鎖定后,可以從 Slack 聊天中手動“強制”部署。
* 在審查代碼時,團隊非常挑剔。 質量標準設置得很高。 測試是強制性的。
* 在 Unicorn 重新加載代碼之前,將在生產中進行預熱。 它包括對門戶網站各個關鍵部分的若干請求。
* 在預熱期間,如果任何一個請求均未返回 200 OK,則舊代碼將保留,并且部署將失敗。
* 有時,測試/預熱未發現問題,并且已損壞的代碼發布到了生產環境中。
* 錯誤將流式傳輸到 Graylog 服務器。
* 如果錯誤率超過閾值,則會觸發警報。
* 錯誤率警報和失敗的構建通知會立即報告給 Slack 聊天。
* 所有錯誤都包含額外的元數據:Unicorn worker 主機和 pid,HTTP 請求詳細信息,導致問題的代碼的 git 修訂版,錯誤回溯。
* 某些類型的“致命”錯誤也直接報告給 Slack 聊天。
* 每個部署日志都包含帶有所有更改的 GitHub 差異 URL。
* 如果生產中出現問題,由于變更集和即時錯誤反饋的原因,很容易快速查明問題。
* 部署詳細信息會報告給 NewRelic,從而可以輕松解決性能瓶頸的引入。
## 減少生產時間
快速發布和穩定發布都非常受關注,團隊一直在努力使構建和部署時間盡可能短。
* 完整的測試套件包含> 7000 個測試,運行時間約為 3 分鐘。
* 不斷添加新的測試。
* Jenkins 在具有 32 個 CPU,128G RAM 和 SSD 驅動器的裸機上運行。
* Jenkins 將所有測試分成多個塊,并并行運行它們,以匯總最終結果。
* 在沒有并行化的情況下,測試將在一臺普通計算機上運行 1 個小時以上。
* 在 Jenkins 中,對于 master 分支中的每次提交,Rails 資產都是預先構建的。
* 在部署期間,從 jenkins 下載預建資產,并將其上載到所有目標服務器。
* 將版本上載到目標服務器時使用 BitTorrent。
## 運行實時數據庫遷移
在大多數情況下,即使在高峰時間,我們也可以在不停機的情況下更改生產 MySQL 數據庫的結構。
* 在任何部署期間都可能發生數據庫遷移
* Percona 工具箱的 pt-online-schema-change 用于在表的副本上運行更改,同時使其與原始副本保持同步,并在更改完成后將副本與原始副本切換
# 運作方式
## 服務器配置
* Chef 用于提供我們基礎架構的幾乎所有方面。
* SRE 團隊確實會提出對基礎結構更改的請求,就像開發團隊對代碼更改所做的一樣。
* 詹金斯(Jenkins)正在驗證所有 Chef 拉取請求,運行交叉依賴關系檢查,食品評論等。
* 團隊在 GitHub 上審查了廚師代碼的更改。
* 開發人員可以向 Chef 存儲庫發出基礎結構更改請求請求。
* 合并拉取請求時,Jenkins 上載更改后的 Chef 食譜并將其應用于生產中。
* 計劃產生 DigitalOcean 小滴以與 Jenkins 一起進行 Chef 廚房測試。
* Jenkins 本身是使用 Chef 配置的,而不是使用 Web UI。
## 監控方式
* 仙人掌圖服務器端指標
* Nagios 檢查可能出現的所有故障
* Nagios 健康檢查,用于我們的某些應用程序和服務
* Statsd / Graphite,用于跟蹤應用程序指標,例如成員登錄,注冊,數據庫對象創建
* Grafana 用于漂亮的儀表板
* 可以使用 Chef 動態描述和創建 Grafana 儀表板
## 聊天操作
* Hubot 坐在 Slack 中。
* 松弛房間通過 [hubot-pubsub](https://github.com/spajus/hubot-pubsub) 訂閱了各種事件通知。
* #deploy 會議室顯示有關部署的信息,并提供指向 GitHub diff,Jenkins 控制臺輸出等的鏈接。在這里,可以使用簡單的聊天命令來觸發,鎖定和解鎖部署。
* #deploy-fail 會議室僅顯示部署失敗。
* #failboat 會議室顯示有關錯誤率和生產中個別錯誤的公告。
* 有多個#failboat- *房間,其中提供有關 cron 故障,卡住的 resque 作業,nagios 警告,newrelic 警報的信息。
* 每天兩次將 Graylog 錯誤與 GitHub 進行處理和交叉檢查,生成報告并將其提交給開發團隊。
* 如果有人在 GitHub 上提到您,Hubot 會在 Slack 上的私人消息中為您提供該問題的鏈接。
* 在 GitHub 中創建問題或請求請求時,提到的團隊會在其適當的 Slack 會議室中收到 ping 命令。
* 可以通過 Hubot 在 Slack 聊天中查詢并顯示石墨圖。
* 您可以向 Hubo??t 詢問有關基礎設施的問題,即有關部署特定服務的機器的問題。 Hubot 查詢 Chef 服務器以獲取數據。
* 開發人員將 Hubot 通知用于我們應用中發生的某些事件。 例如,向客戶支持聊天室自動通知可能的欺詐案件。
* Hubot 與 Office [netatmo](https://www.netatmo.com/) 模塊集成在一起,可以告訴所有人什么是 CO2,噪聲,溫度和濕度水平。
# 數據倉庫堆棧
* 我們從兩個來源提取數據:
* 網站事件跟蹤數據:印象數,點擊數等
* 數據庫(MySQL)更改。
* 大多數事件跟蹤數據都從 JavaScript / Android / iOS 前端應用程序發布到 HTTP 端點。 一些事件由我們的核心 Ruby on Rails 應用程序發布到本地 UDP 套接字。 我們選擇 UDP 以避免阻塞請求。
* 有一種服務可以監聽 UDP 套接字上的新事件,對它們進行緩沖,并定期在 Kafka 中發出原始事件的主題。
* 流處理服務使用原始事件主題,驗證事件,將它們編碼為 Avro 格式,然后發出特定于事件的主題。
* 我們將事件的 Avro 模式保存在單獨的集中式模式注冊表服務中。
* 無效事件被置于單獨的 Kafka 主題中,以進行可能的更正。
* 我們使用 LinkedIn 的 Camus 作業將事件從特定于事件的主題逐步轉移到 HDFS。 事件到 Hadoop 的時間通常最多為一個小時。
* 使用 Hive 和 Impala 進行臨時查詢和數據分析。
* 研究基于伸縮的數據處理解決方案。
* 報告使用我們內部開發的,用 Ruby 編寫的類似 OLAP 的報告系統運行。
# 得到教訓
## 產品開發
* 投資代碼質量。
* 通過測試涵蓋所有內容。
* 發布小更改。
* 使用功能開關將未完成的功能部署到生產中。
* 開發某些東西時,不要保留長時間運行的代碼分支。
* 投資一個快速的發布周期。
* 首先構建移動產品。
* 設計 API 從一開始就很好,以后很難更改。
* 在 RabbitMQ 消息中包含發件人主機名和應用程序名稱可以節省生命。
* 不要猜測或做假設,請進行 [AB](https://github.com/vinted/ab) 測試并檢查數據。
* 如果您打算將 Redis 用于更大的事情,請從一開始就考慮分片。
* 如果您計劃使 Rails 保持最新狀態,則切勿使用叉狀和稍作修飾的紅寶石寶石。
* 通過社交網絡盡可能輕松地共享您的內容。
* 搜索引擎優化是一項全職工作。
## 基礎設施和運營
* 經常部署以提高系統穩定性。 起初聽起來可能違反直覺。
* 自動化一切。
* 監視所有可能發生的故障。
* 網絡交換緩沖區很重要。
* 容量規劃很困難。
* 從一開始就考慮 HA。
* RabbitMQ 集群不值得付出努力。
* 測量并繪制所有圖形:HTTP 響應時間,Resque 隊列大小,模型持久率,Redis 響應時間。 您無法改善無法衡量的東西。
## 數據倉庫堆棧
* Hadoop 生態系統中有許多工具。 很難選擇合適的。
* 如果您正在為 Hive 編寫用戶定義函數(UDF),那么該考慮使用非 SQL 解決方案進行數據轉換了。
* “ Hadoop 應用程序”概念含糊不清。 通常,我們需要手動將應用程序組件粘合在一起。
* 每個人都編寫自己的工作流管理器。 并且有充分的理由。
* 分布式系統監視非常困難。 異常檢測和作圖很有幫助。
* 核心 Hadoop 基礎架構(HDFS,YARN)堅如磐石,但較新的工具通常會有細微差別。
* 卡夫卡很棒。
這個網站是關于高可擴展性還是如何浪費服務器? 您是否真的需要 220 臺服務器來服務?2300req / sec?
他了解了其中一些服務器使用情況。 這是 Ruby on Rails,所以這就是原因。
您能否詳細說明“ RabbitMQ 集群不值得付出”? 您在運行時遇到問題嗎?
@Peter-與其他高可用性站點一樣,它們可以使用少于十個服務器來為流量提供服務。
從文章看來-其余內容涉及(a)收集和分析數據; (b)監督和監督系統; (c)確保高可用性。
在三個區域中只有 10 臺邊緣(緩存/ nginx)服務器(由于 HA,30 臺獨角獸是自然擴展)。 鑒于流量不統一(因此 200M req / day 不能轉換為 2300 req / s),這似乎是適中的,因為在任何區域中,請求都只能由幾個端點服務器之一來處理。 再次-這就是您在 HA 設置中所期望的-2 個以上的服務器用于任何潛在的傳入(請求)請求。
我必須同意彼得的觀點。 在最近閱讀了此處的 Stack Exchange 文章之后,很難不認為此設置會浪費一些資源。
感謝分享。
您似乎正在使用大量的開源項目。 我對你的決定感到好奇。 團隊成員一開始是否已經熟悉大多數技術? 如果沒有,那么在這么多方面加強工作是否有點勢不可擋?
大家好,
Vaidotas,這里的 Vinted 工程師之一。
想對服務器數量發表評論。 如果您查看詳細信息,將會看到很多服務器專用于分析數據收集。 而且我認為分析數據可能是單獨的主題。
如果您查看運行 Vinted 應用程序所需的服務器及其所有內容,則會看到以下內容:
34 個用于圖像處理和存儲(9.3 億張照片)
30 個用于 Unicorn 和微服務(每天 2 億個請求)
28 個用于 MySQL 數據庫,包括副本
19 個用于 Sphinx 搜索(2500 萬個列出的項 索引)
10,用于可處理的后臺作業
10,用于與 Nginx 進行負載平衡(充當代理和一些緩存,可能會更少,但在我們運營所在的不同國家/地區需要它們)。
Redis 4
因此,這就是 135 臺運行應用程序基礎結構的服務器。 現在請記住,所有內容都必須具有高可用性。 這意味著至少所有內容的 2 倍,即使您目前不需要/不使用它也是如此。
希望能解釋一下服務器數量。
另外,您的行動小組的規模如何,才能維持這種運營/基礎架構? 僅列出了 SRE。5\. DevOps 工程師,系統管理員和/或 DBA 怎么樣?
您的 Jenkins 并行化設置似乎很有趣。 你是如何做到的? 也許不久之后還會有另一篇專門針對此的博客文章?
喬恩,我們有 5 位站點可靠性工程師來維護所有基礎架構。 我們執行從服務器引導到數據庫管理的所有工作。 我們嚴重依賴自動化:)
我真正無法理解的是-每天 200 M 的請求如何轉換為實際的 Internet 流量? StackExchange 的請求量為 1.5 億,在 Alexa 評分中排名第 53,vinted.com 在 38763 上排名較高,但 RPS 較高。
與 http://highscalability.com/blog/2014/11/10/nifty-architecture-tricks-from-wix-building-a-publishing-pla.html(wix)相同-他們要求 700M 請求/ 一天,但肯定無法將 Alexa 評級與 StackExchange 相比。
誰能澄清?
@tao,一開始只有一個開發人員(CEO,聯合創始人),而且技術堆棧要小得多。 您的問題的答案是否定的。
當項目開始發展時,出現了一些東西。 我們雇用了更多的開發人員,工程師等。我們選擇雇用最聰明的工程師。 之所以使用某些技術是因為他們具有經驗,而其他技術則是“試驗和錯誤”(尤其是大數據的東西)。 我們在解決問題的過程中一直在解決它們。 我們仍然有需要解決的問題。 這就是新技術出現的方式。 我相信,一年后,我們可以寫一篇關于我們如何做事的文章。
@lan:RabbitMQ 非常棒,我們正在使用它,但是在分析事件方面,我們遇到了一些限制,因此選擇 kafka 作為事件發射。 RabbitMQ 集群的東西很容易破解。 正如文檔所述-“ RabbitMQ 群集不能很好地容忍網絡分區”,這并不像我們希望的那樣罕見。
@Tim:我們使用 https://github.com/grosser/parallel_tests 的稍加修改版本
@安東:不確定“轉換”的含義,但我們為女孩提供了超過 10 Gigs 的流量。 在談論 Alexa 時,目前我們有 8 個不同的國家,例如,我們的一個國家(http://kleiderkreisel.de)的排名為 7,468,因此沒有一個匯總排名。 另一件事是,70%的流量來自移動應用程序,我不確定 Alexa 是否會對此進行計數。
希望大家,Vinted 回答了您所有的問題:)
- 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 內容平臺的經驗教訓