# Egnyte 體系結構:構建和擴展多 PB 分布式系統的經驗教訓
> 原文: [http://highscalability.com/blog/2016/2/15/egnyte-architecture-lessons-learned-in-building-and-scaling.html](http://highscalability.com/blog/2016/2/15/egnyte-architecture-lessons-learned-in-building-and-scaling.html)

*這是 [Kalpesh Patel](https://www.linkedin.com/in/kpatelatwork) 的來賓帖子,他是在家工作的建筑師。 他和他的同事們花費大量的工作時間擴展了那里最大的分布式文件系統之一。 他在 [Egnyte](https://www.egnyte.com/) (一家企業文件同步共享和分析啟動)中工作,您可以在 [@kpatelwork 與他聯系 ]](https://twitter.com/kpatelwork) 。*
您的筆記本電腦有一個文件系統,該文件系統被數百個進程使用,它受到磁盤空間的限制,無法彈性擴展存儲,如果您運行一些 I / O 密集型進程或嘗試與 100 個其他用戶共享該文件系統,它會令人窒息。 現在解決這個問題,并將其放大為遍布全球的數百萬付費用戶使用的文件系統,您將可以通過云霄飛車擴展該系統,以滿足每月的增長需求并滿足 SLA 要求。
**Egnyte 是一家企業文件同步和共享創業公司**,成立于 2007 年,當時 Google 硬盤還沒有誕生,而 AWS S3 的成本卻很高。 我們唯一的選擇是放開袖子,自己建立一個對象存儲,S3 和 GCS 的超時成本變得合理,并且由于我們的存儲層基于插件架構,因此我們現在可以插入任何便宜的存儲后端。 我們已經多次重新架構了許多核心組件的架構,在本文中,我將嘗試分享當前的架構是什么,我們學到的擴展規模的經驗教訓以及我們仍需改進的內容。
## 平臺
* Tomcat
* MySQL
* HAProxy
* Nginx
* Memcached
* Apache
* [Elasticsearch](https://www.elastic.co/)
* Redis
* RabbitMQ
* CentOS
* 人偶
* 新遺物
* AppDynamics
* ZooKeeper
* LDAP
* Nagios
* 石墨
* 仙人掌
* Apache FTP 服務器
* OpenTSDB
* Google BigQuery
* Google BigTable
* Google Analytics
* MixPanel
* 表格
* ReactJS /主干/木偶/ jQuery / npm / nighwatch
* Rsync
* [PowerDNS](https://www.powerdns.com/)
* 服裝
* 基于 REST API 的 SOA 體系結構。
* Java 用于驅動核心文件系統代碼
* Python 通常用于驅動大多數客戶端代碼,遷移腳本,內部腳本。 一些 python 代碼仍駐留在服務器上,但是由于我們有更多具有 Java 熟悉和擴展經驗的服務器開發人員,因此大多數 python 代碼已遷移到 Java。
* 原生 Android / iOS 應用
* 適用于各種平臺的桌面和服務器同步客戶端
* GCE
* GCS / S3 / Azure /...。
## 統計信息
* 3 個主要數據中心,包括歐洲的 1 個(根據安全港規定)
* 200 多個 Tomcat 服務節點
* 由 Tomcat / nginx 提供支持的 300 多個存儲節點
* 100 多個 MySQL 節點
* 50 多個 Elasticsearch 節點
* 20 多個 HAProxy 節點
* 和許多其他類型的服務節點
* 我們服務器和 GCS 中存儲了數 PB 的數據
* 在 Elasticsearch 中建立索引的數 PB 數據內容
* 許多桌面客戶端將文件與云同步
## 認識您
### 您的系統名稱是什么,我們在哪里可以找到更多信息?
Egnyte 是啟動公司的名稱,核心系統有很多主要部分,例如 CFS(云文件服務器),EOS(Egnyte 對象存儲),事件同步和...。您可以在中找到更多有關這些的內容。 [對于技術人員](https://www.egnyte.com/blog/category/for-the-techies/) 部分,在我們的博客中。
### 您的系統是干什么的?
它推動了成千上萬企業的同步和共享需求,并且云使它們的現有文件系統可以被 FTP,webdav,移動,公共 api,Web UI 和...等各種端點使用。
### 您為什么決定構建此系統?
在 2007 年,企業/員工隊伍開始變得越來越分散,客戶正在使用多個設備來訪問相同的文件,并且有必要使這種體驗盡可能的順暢
### 您的項目經費如何?
這是一家自負盈虧的公司,后來我們在過去 8 年中進行了 5 輪募集,籌集了 6250 萬美元[](https://www.crunchbase.com/organization/egnyte#/entity)
### 您的收入模式是什么?
我們沒有免費用戶,但是我們提供 15 天免費試用,之后客戶無需支付席位即可付費。
### 您如何銷售產品?
我們從 SEM / SEO 開始,但隨著時間的增長,我們通過許多渠道為企業客戶爭取了諸如社交媒體,Biz 開發,貿易展覽,SEM,SEO,入站營銷和高聯系銷售的客戶。
### 您從事這項工作多久了?
它成立于 2007 年,目前已有 8 年的歷史。
### 您的系統多大? 嘗試感受一下系統的工作量。
我們存儲數十億個文件和多個 PB 的數據。 根據 New Relic,我們平均每秒觀察到超過 2K 的 api 請求。 由于安全港規定和位置相近,我們將數據存儲在 3 個主要數據中心中。 有關更多信息,請參見統計信息部分。
### 您的輸入/輸出帶寬使用量是多少?
我沒有確切的數字,因為它一直在增長,但是客戶上個月下載了接近 1 PB 的壓縮/未壓縮數據。
### 您提供多少份文件? 多少張圖片? 多少數據?
我們存儲數十億個文件和多個 PB 的數據。 我們存儲各種文件,而我們的前 5 個文件擴展名是 pdf,doc / docx,xl??s / xlsx,jpeg 和 png。
### 免費用戶與付費用戶的比例是多少?
我們所有的用戶均為付費用戶。 我們提供 15 天的免費試用期,之后將其轉換或將其禁用。
### 在過去一個月中有多少個帳戶處于活動狀態?
我們所有的客戶都是付費帳戶,并且每個月幾乎所有人都活躍。 我們滿足他們文件系統的需求,誰在家不用電?
## 您的系統如何設計?
### 您的系統的體系結構是什么?
我們使用基于 REST 的面向服務的體系結構,它使我們能夠獨立擴展每個服務。 這也使我們能夠將一些后端服務移至公共云中托管。 所有服務都是無狀態的,并使用數據庫或我們自己的對象存儲進行存儲。 由于服務眾多,因此很難將所有服務都繪制在一張圖中。
[典型請求流](https://www.egnyte.com/blog/2015/02/handling-millions-of-requests-at-egnyte/) 的 10000 英尺總覽如下

大約 10000 英尺的 [搜索架構](https://www.egnyte.com/blog/2015/06/scaling-elasticsearch-at-egnyte/) 如下

### 您的系統面臨哪些特定的設計/架構/實施挑戰?
最大的 架構 挑戰包括:-
1. 節儉地擴展文件存儲
2. 擴展元數據訪問
3. 文件與桌面客戶端的實時同步
### 您是如何應對這些挑戰的?
1. 對于存儲,我們編寫了自己的存儲,現在我們使用可插拔的存儲體系結構將其存儲到任何公共云,例如 S3,GCS,Azure...。
2. 為了擴展元數據,我們移至 Mysql 并開始使用分片。 在某個時候,我們暫時投入了更多的硬件來騰出空間,以便一層一層地剝去鱗屑洋蔥。
3. 為了進行實時同步,我們必須更改同步算法,使其更像 Svn,客戶端接收增量事件并嘗試與云狀態進行最終的一致同步。
4. 監視,監視和監視。 您無法優化無法衡量的內容。 在某些時候,我們監控太多,無法專注于所有指標,我們不得不依靠異常檢測工具,例如 New Relic,AppDynamics,OpenTSDB 和自定義報告,以使我們能夠專注于綠色問題[ >黃色->紅色。 目的是在客戶通知 之前,將它們捕獲為黃色并且 [時捕獲它們。](https://www.egnyte.com/blog/2013/06/improving-service-reliability/)
### 您的系統如何發展以應對新的擴展挑戰?
我們已經多次重新構造了許多層。 我無法在本文中全部講述,但我將嘗試列出過去 7 年中核心元數據,存儲,搜索層的幾次迭代。
1. 版本 1:在 Lucene 中搜索文件元數據,通過 NFS 安裝在 DRBD Filers 中存儲的文件,在 Lucene 中搜索。 阻塞點 :Lucene 更新不是實時的,必須替換。
2. 版本 2:Berkeley db 中的文件元數據,通過 NFS 安裝在 DRBD Filers 中的文件,在 lucene 中搜索。 阻塞點 :我們突破了 NFS 的限制,它左右左右都阻塞了,必須用 http 代替。
3. Version3:Berkeley db 中的文件元數據,通過 HTTP 服務的 EOS Filers 中存儲的文件,在 lucene 中搜索。 阻塞點 :即使分片的 Berkeley DB 在壓力下也阻塞,并且數據庫崩潰,恢復工作數小時,必須更換它。
4. 版本 4:MySQL 中的文件元數據,通過 HTTP 服務的 EOS Filers 中存儲的文件,在 lucene 中搜索。 阻塞點 :公共云開始變得便宜。
5. 版本 5:MySQL 中的文件元數據,存儲在 EOS / GCS / S3 / Azure 中并通過 HTTP 服務的文件,在 lucene 中進行搜索。 阻塞點 :搜索開始阻塞,必須更換。
6. 版本 6:MySQL 中的文件元數據,通過 HTTP 服務的 EOS / GCS / S3 / Azure 中存儲的文件,在 Elasticsearch 中搜索。 這是當前的體系結構,很快,其中一個可能需要另一個輪回:)。
### 您是否使用任何特別酷的技術或算法?
* 在核心服務之間進行呼叫時,我們使用 [指數補償](https://en.wikipedia.org/wiki/Exponential_backoff) 斷路器,以避免斷路器打雷。
* 我們在核心服務節點資源上使用公平分配分配方式來處理傳入請求。 標記核心服務節點上的每個傳入請求并將其分類為不同的組。 每個組都有專用的容量,如果一個客戶每秒發出 1000 個請求,而另一個客戶每秒發出 10 個請求,則此系統將確保第二個客戶不會遇到嘈雜的鄰居問題。 訣竅是,兩個客戶都可能由于哈希而巧合地落在某個節點上的同一組上,但他們不會降落在所有節點上的同一組上,因此我們將節點名稱作為鹽添加到哈希中。
* 帶有 SLA 的某些核心服務被隔離在 POD 中,這確保了一個糟糕的客戶不會阻塞整個數據中心。
* 我們在桌面同步客戶端代碼中使用基于事件的同步,因為發生服務器事件時,它們會從服務器推送到客戶端,并且客戶端會在本地重播它們。
### 您做什么工作是與眾不同的,人們可以從中學到什么?
專注于啟動的核心功能,如果必須構建定制的內容,那就去啟動它。 有很多獨特的東西,但是存儲層,基于事件的同步絕對值得學習,這里有更多詳細信息。 [Egnyte 對象存儲庫](https://www.egnyte.com/blog/2013/07/how-egnyte-implements-hybrid-object-stores-using-public-clouds-to-enhance-customer-experience/) 和 Egnyte [規范文件系統](https://www.egnyte.com/blog/2015/04/egnyte-canonical-file-system/) 。
## 您學到了什么?
* 您無法優化無法測量的內容:測量所有可能的結果,然后優化系統中首次使用 80%的部分。
* 當您身材矮小的時候,請慢慢介紹技術,不要試圖從中找到解決當前問題的理想工具。 編碼是生命周期中最容易的部分,但是如果您最初使用的技術太多,則其維護(如部署/操作/學習曲線)將非常困難。 當您很大時,您將有足夠的脂肪來劃分服務,并讓每個服務使用其自己的技術并進行維護。
* 當您是一家初創公司時,有時您必須快速采取行動,介紹您現在可以做的最好的解決方案,如果看到牽引力,則應加班對其進行重新設計。
* 尋找單點故障,并不懈地尋找下來。 付出額外的努力來解決使您徹夜難眠的問題,并盡快從防御性轉變為進攻性模式。
* 在 SOA 中,如果您的服務受阻,則構建斷路器以開始發送 503s。 與其懲罰每個人,不如看看是否可以公平分配資源并僅懲罰濫用用戶。
* 在服務使用者中添加了自動修復功能,服務可能會停止運行,桌面客戶端或其他服務之類的消費者可以進行指數補償以釋放服務器壓力并在該服務再次運行時自動修復。
* 始終可用:請客戶提供服務級別的斷路器和斷路器。 例如 如果通過 webdav 或 FTP 訪問文件系統存在性能問題,并且需要 4 個小時進行修復,那么在這 4 個小時內,您只需在防火墻處殺死 FTP / webdav 并要求客戶使用 Web ui 或其他機制即可工作。 同樣,如果一個客戶引起了異常,使系統窒息,則可以暫時為該客戶禁用該客戶或服務,并在問題解決后重新啟用它。 為此,我們使用功能標志和斷路器。
* 保持簡單:每個月都有新工程師加入,因此目標是從第一周開始就提高他們的生產力,簡單的架構可確保輕松上崗。
### 您為什么成功?
牽引力勝過一切。 當 EFSS 市場剛剛爆發時,我們達到了 [產品/市場適合度](https://www.linkedin.com/pulse/marc-andreessen-product-market-fit-startups-marc-andreessen) 。 具有良好執行力的時機,管理團隊的財務紀律導致成功。 許多競爭對手采用了免費增值模式,并籌集了大量資金,但是從第一天開始我們就開始收費,這使我們能夠專注于根據市場需求發展解決方案/團隊。 專注于付費客戶使我們能夠交付企業級解決方案,而無需支付免費增值罰金。
### 您希望自己做些什么?
我希望當我們開始時公共云的成本不會過高。 我也希望我們從第一天開始就使用 SOA,花了一些時間才到達那里,但是現在我們就在那里。
### 您不會更改什么?
目前,我不會替換 MySQL / EOS,因為它允許我們從防御性定位轉到進攻性定位。 我不能在兩年后發表評論,我會有相同的想法,我們可能會更改或擴大其中的一些想法。 當您遇到下一個增長突增時,架構會發生變化。
## 您應該做多少前期設計?
很好的問題。 答案是“取決于”,
* 如果您要設計核心存儲層或核心元數據層之類的東西,那么再多花 2 周的時間對您的設計不會有太大的影響。 當我們在核心元數據層上從 Berkeley DB 遷移到 MySQL 時,我承受著很大的壓力,我曾想過要走捷徑,當我通過首席技術官運行時,他建議花一些時間并“做正確的事”。 作為回顧,這是一個極好的決定。
* 對于公共 API,最好做一個不錯的前端設計,因為您沒有第二次機會對其進行更改,并且必須在未來 4-5 年內進行維護。
* 但是,如果您要為內部服務設計某些東西并將其遷移到新架構的時間不超過一年,那么我建議您進行非常少的前端設計,并快速構建版本并隨著使用量的增長對其進行迭代。
## 您如何考慮將來更改架構?
* 在一周中進行部署(我們快到了)
* 將更多公共云用于任何新服務,并將更多服務遷移到公共云。
* 將其余的源代碼從 svn 移至 git
* 使當前的開發環境盡可能接近生產環境(可以使用 docker 或…)。
* 自動化架構管理
* 添加更多性能基準測試
* 建立持續的交付渠道,以便我們可以將部署增加為每周或每天,而不是每兩周一次。
* 通過重新構建從某些增長最快的表中刪除聯接。
* 為 Mysql 分片添加自動平衡器,因此我不必擔心偶爾出現的熱點。
* 將某些脂肪服務分成顆粒狀
* 使用內存緩存代理
## 您的團隊如何設置?
### 您的團隊中有多少人?
大約有 100 名工程師(devops / ops / qa / developers / ...),其余的是銷售,市場營銷,支持和人力資源。
### 他們在哪里?
最初是分散的工程團隊,但現在主要吸引人是孟買的 [波茲南](https://en.wikipedia.org/wiki/Pozna%C5%84) 。 一些像我這樣的遠程員工 和其他一些員工在家工作。
### 誰扮演什么角色?
這是一個很大的團隊,我們有產品經理,UX 團隊,開發人員,Scrum 團隊,架構師,工程師扮演各種角色。 最初,工程團隊很平坦,每個人都會向工程副總裁報告,但現在我們在兩者之間增加了一層管理。
### 您是否有特定的管理理念?
如果您開發某些產品,那么您擁有該產品的生命周期,這意味著您將與 QA,devops 一起確保其測試/部署。 投入生產時,您可以使用各種內部工具(例如 New Relic / Nagios)對其進行監視,如果存在回歸,則可以對其進行修復。
### 如果您有分散的團隊,該如何工作?
自治,1-1 交流,黑客馬拉松使他們具有挑戰性,他們會受到激勵。
### 您的開發環境是什么?
* 適用于服務器團隊的 Ubuntu
* UI 團隊使用 Windows / mac 并連接到用于 REST API 服務器的本地 Ubuntu VM 或連接到共享的 QA 實例
* Eclipse /想法
* 適用于構建的
* Maven
* Git / SVN
* 詹金斯
* ReviewBoard / Sonar
* JIRA
* Google 文檔
* Jabber / Slack / Hangouts / Skype
### 您的開發過程是什么?
我們在服務器團隊中使用 Scrum,并且每兩周發布一次。 長期功能開發人員/團隊在沙盒上工作,完成后通過單元測試/硒/手動 QA 對它進行測試,然后合并到主干以捕獲 2 周的發布流程。 我們吃了自己的狗糧,代碼在發布前 1 周發布到了 UAT(所有員工使用的 egnyte.egnyte.com),我們發現了自動化測試未發現的任何意外情況。 我們在每個星期五晚上進行生產部署,并且 [每天監視新文物,并針對任何異常](https://www.egnyte.com/blog/2013/06/improving-service-reliability/) 每天報告異常報告。 我們正在將部署更改為即將在一周中完成。
### 您有什么可以做的不同還是感到驚訝?
許多工程師在家工作,令人驚訝的是,有了自主權,許多遠程員工像總部員工一樣富有生產力和積極性。
## 您使用什么基礎架構?
### 您使用哪種語言來開發系統?
大多數是 Java / Python
### 您有多少臺服務器?
最后,我知道我們有 700 多個。 100 多個 MySQL 服務器,50 多個 Elasticsearch,200 多個 tomcat 服務節點,300 多個本地存儲節點,20 多個 HAProxy 節點和緩存文件管理器,nginx,python 服務器以及其他各種節點。
### 如何將功能分配給服務器?
我們使用面向服務的體系結構,并根據服務類型分配服務器。 一些頂級服務是:
* 元數據
* 儲存空間
* 對象服務
* Web UI
* 索引
* EventSync
* 搜索
* 審核
* 快照/數據監視器
* 內容智能
* 實時事件傳遞
* 文本提取
* 集成
* 縮略圖生成
* 防病毒軟件
* 垃圾郵件
* 預覽版
* rsync
* API 網關
* 結算
* 支持
* 銷售
* 等等。
### 如何配置服務器?
大多數服務都是偽造的,并且可以在 VM 上運行,我們僅針對 MySQL,memcached,Metadata 服務器,索引之類的少數事物運行物理服務,但是除了數據庫/緩存/存儲節點之外,大多數服務都可以轉換為 VM。 我們使用第三方根據模板來配置服務器,并將其放入數據中心,以供使用。
### 您使用什么操作系統?
CentOS7
### 您使用哪個 Web 服務器?
Nginx,Apache。 在一些舊的流程中使用了 Apache,但隨著時間的流逝,它將被棄用。
### 您使用哪個數據庫?
MySQL。 我們過去曾使用過其他數據庫,例如 Berkeley DB,Lucene,Cassandra,但是由于開發人員/操作人員的熟悉程度和可伸縮性,我們將所有數據庫都超時遷移到了 MySQL。 有關更多信息,請參見 Egnyte 的 [MySQL](https://www.egnyte.com/blog/2012/10/mysql-at-egnyte/) 。
### 您是否使用反向代理?
是 Nginx 和 HAProxy
### 您是否并置,使用網格服務,使用托管服務等?
我們搭配。
### 您的存儲策略是什么?
我們首先創建自己的服務器,然后在機器中打包盡可能多的硬盤驅動器,我們過去將它們稱為 DRBD Filers。 我們這樣做是因為 AWS 成本過高。 我們已經對 [GlusterFS](https://www.gluster.org/) 進行了評估,但是當時它無法擴展以滿足我們的需求,因此我們構建了自己的。 加班 S3 變得便宜了,GCS / Azure 誕生了,我們將存儲層設計為可插入的,因此現在客戶可以決定要使用哪個存儲引擎(例如,Egnyte,S3,GCS,Azure 等)。
### 您如何增加產能?
我們進行能力計劃會議,并根據監控指標中的關鍵指標并預定一些額外的能力得出了一些指標。 現在,某些服務已啟用云服務,我們只需單擊一下按鈕即可提供更多服務。
### 您是否使用存儲服務?
是 Egnyte,S3,GCS,Azure 和
### 您如何處理會話管理?
我們多次重寫了體系結構,目前 99%的服務是無狀態的。 僅服務于 Web UI 的服務使用會話,我們在 [memcached-session-manager](https://code.google.com/archive/p/memcached-session-manager/) 支持的 tomcat 中使用粘性會話,但最終我的計劃是使它也變得無狀態 。
### 您的數據庫是如何設計的? 主從? 碎片? 其他?
我們對幾乎所有具有自動故障轉移功能的數據庫都使用了 Master-Master 復制,但是某些嚴重變異的數據庫的切換是手動完成的,我們遇到了一些問題,由于復制滯后,自動切換會導致應用程序數據不一致,我們 需要重新架構一些核心文件系統邏輯來解決此問題,我們最終將完成此工作。 下面是有關處理數據庫升級的問題,詳細回答了有關數據庫體系結構的更多詳細信息。
### 您如何處理負載平衡?
我們根據客戶使用 DNS 訪問系統的 IP 進行地理平衡,并在數據中心內使用 HAProxy 將其路由到相應的 POD,并在內部 POD 中再次使用 HAProxy 路由
### 您使用哪個 Web 框架/ AJAX 庫?
我們已經多次更改了 UI,這是一直在變化的一件事。 過去我們曾經使用過 ExtJS,YUI,JQuery,而沒有使用過。 最新的迭代基于 ReactJS / Backbone / Marionette 。
### 您使用哪種實時消息框架?
我們使用 [大氣](https://github.com/Atmosphere/atmosphere) ,但最終我們將其替換為 NodeJS
### 您使用哪個分布式作業管理系統?
為此,我們使用 RabbitMQ 和基于 Java / python 的消費者服務。
### 您的網站是否有標準 API? 如果是這樣,您將如何實施?
我們的 API 分為 3 種類型:-
1. 公共 API: 這是我們提供給第三方應用程序開發人員和集成團隊以及我們的移動應用程序的 api。 我們會按照適當的棄用工作流程棄用/升級 api 簽名,并且更改始終向后兼容。 我們使用 Mashery 作為網關,API 記錄在 [https://developers.egnyte.com/docs](https://developers.egnyte.com/docs)
2. 適用于我們客戶的 API: 此 API 對我們客戶而言是內部的,如果我們以外的人使用此 API,我們不保證向后兼容。
3. 服務之間的內部受保護的 API :這是服務在我們的數據中心內部用于彼此通信的 API,無法從外部防火墻調用。
### 您的對象和內容緩存策略是什么?
我們存儲的數據為 PB 級,無法緩存所有數據,但是如果客戶在給定的 15 天時間內擁有 5000 萬個文件,則他可能只會使用其中的 100 萬個。 我們有基于 tomcat / nginx / local 文件系統的緩存文件管理器節點,它以 LRU 方式運行。 我們可以彈性增加減少緩存文件服務器的數量。 我們最大的問題之一是上傳速度,如何從世界任何地方盡可能快地將數據上傳到 Egnyte,為此,我們建立了特殊的 Network pops,如果您好奇的話可以在閱讀更多內容 [為 Egnyte 客戶加速數據訪問](https://www.egnyte.com/blog/2014/03/speeding-up-data-access-for-our-customers/)
Memcached 用于緩存元數據,我們使用單獨的 memcached 池來緩存長期存在的靜態數據和文件系統元數據。 核心文件系統元數據非常龐大,不適合當前的內存緩存節點,并且會逐出最近使用的其他類型的數據。 為防止這種情況,我們使用兩種類型的池,應用程序代碼決定在哪里查找哪種數據。 我們允許在文件系統內存緩存中逐出,并在其他種類的內存池中爭取零逐出。
### 您的客戶端緩存策略是什么?
對于我們的 Web ui,我們使用 PageSpeed 進行資源優化,緩存,并使用 requireJS 和其他各種方式僅下載所需的模塊。 我們的 Mobile 和 Desktop 客戶端豐富使用本地文件系統作為緩存。
### 您使用哪些第三方服務來幫助您構建系統?
Google BigQuery,New Relic,AppDynamics,MixPanel,Flurry,Tableau 是我們使用的一些分析服務,但大多數核心組件均由我們構建。
## 您如何管理系統?
### 如何檢查全局可用性并模擬最終用戶性能?
我們使用不同 AWS 區域中的節點來一致地測試帶寬性能。 我們還使用內部 haproxy 報告來繪制客戶觀察到的上載/下載速度,并主動尋找它們,并使用網絡彈出和其他策略來加速數據包。

### 您如何健康檢查服務器和網絡?
使用了 Nagios 監視器和 New Relic,以及一些內部主動式異常分析。 有關更多詳細信息,請參見此 [博客文章](https://www.egnyte.com/blog/2013/06/improving-service-reliability/)
### 如何繪制網絡和服務器統計數據以及趨勢圖?
我們使用石墨,仙人掌,Nagios 和 New Relic,AppDynamics。


### 您如何測試系統?
硒,Junit,鼻子,睡表和手動測試。
### 您如何分析效果?
AppDynamics 是 New Relic,用于監視生產 tomcat 節點的性能。 我們使用石墨/ nagios /內部工具和其他工具來監視系統其他部分的性能。 有關此問題的更多詳細信息,請參見此博客文章 [分布式系統中的調試性能問題](https://www.egnyte.com/blog/2014/10/debugging-performance-issues-in-distributed-systems/)
### 您如何處理安全性?
專用安全團隊在每個版本之前都會運行自動化的安全基準測試。 連續自動化筆測試已在生產中運行。 我們還使用漏洞賞金計劃并與 Whitehat 測試公司合作。 一些客戶使用第三方進行自己的安全性測試。
### 您如何處理客戶支持?
我們有專門的 24X7 分布式客戶成功團隊,我們使用 Zendesk 和 JIRA
### 您是否實施網絡分析?
我們使用 Google Analytics(分析),Mixpanel,Flurry 來衡量功能使用情況
### 您是否進行 A / B 測試?
是的,我們使用功能標記進行 A / B 測試。 有關更多信息,請參見 [在 Egnyte 使用功能標志](https://www.egnyte.com/blog/2014/01/how-we-migrated-millions-of-users-from-ldap-to-mysql-using-feature-flags/)
### 您要運行多少個數據中心?
3 個主要數據中心,其中一個在歐洲(由于安全港規定) ,網絡遍布世界各地。
### 您的系統如何部署在數據中心中?
Puppet 用于部署大多數新代碼。 我們仍在重寫體系結構中最后要偽造的部分,而這些部分目前已使用 Shell 腳本進行了部署。
### 您使用哪種防火墻產品?
我們混合使用了瞻博網絡 SRX 和 Fortigate 防火墻。
### 您使用哪個 DNS 服務?
PowerDNS
### 您使用哪些路由器?
思科
### 您使用哪些開關?
Arista
### 您使用哪個電子郵件系統?
我們使用自己的 SMTP 服務器來處理出站電子郵件,對于一些內部工具,我們使用 SendGrid,對于入站電子郵件,我們使用 GMail。
### 如何備份和還原系統?
對于 MySQL,我們使用 [Percona XTraBackup](https://www.percona.com/doc/percona-xtrabackup/2.3/index.html) ,對于 Elasticsearch,該數據被復制 3 次,并且我們還使用 ElasticSearch GCS 備份插件將數據備份到 GCS。 對于客戶文件,我們將其復制 3 次。 如果存儲 Filer 無法恢復,我們將丟棄它,添加一個新 Filer 并再次復制副本。 對于某些客戶,我們還會將其數據復制到他們選擇的提供者。 對于使用 S3,Azure 或 GCS 作為可插拔存儲層的客戶,它將確保復制以防止數據丟失。
### 如何進行軟件和硬件升級?
大多數節點是無狀態的,并且有狀態組件具有主動-主動故障轉移。 通過將節點從池中取出并進行升級并將其放回池中來處理升級。
### 您如何處理升級中數據庫架構的重大更改?
不同的服務使用不同類型的數據庫,并且它們以不同的方式升級。 在 10000 英尺處,它們如下圖所示:

1. EOS db 存儲對象元數據并且增長非常快,它經過分片,并且我們將繼續添加更多此類數據。
2. MDB 的增長速度更快,經過了分片,并且我們會繼續增加更多。
3. DC_central 是 dns 數據庫,并且保持相當靜態。 我們運行了許多此副本以實現可伸縮性。
4. Pod_central 具有快速突變的數據,但每個表的增長量不超過 2000 萬行。 我們運行了許多此副本以實現可伸縮性。
* 每個數據庫模式始終是向前和向后兼容的,即我們絕不會在同一發行版中刪除列和代碼,我們首先在發行版 1 中部署停止使用該列的代碼,在發行版 2 中兩周后我們刪除該列。
* 非分片數據庫每 2 周更新一次。 它們是存儲各種功能驅動表的表。 我們目前使用腳本升級它們,但現在已更改為使用 [Sqitch](http://sqitch.org/)
* 使用自動腳本進行分片 db 新列更改
* 分片數據庫遷移是一件痛苦的事情,因為我們有 7000 多個分片并且還在不斷增長,您無法在 1 小時的升級窗口中完成。 方法是:
* 實時代碼根據需要遷移行。 這意味著遷移可能會持續數年。
* 使用功能標記進行遷移,您同時擁有新舊代碼,并且在后臺遷移客戶,然后翻轉標記以將其切換到新代碼路徑而無需停機,更多的是 [ [此處](https://www.egnyte.com/blog/2014/01/how-we-migrated-millions-of-users-from-ldap-to-mysql-using-feature-flags/) 和 [此處](https://www.egnyte.com/blog/2015/06/scaling-elasticsearch-at-egnyte/)
* 當我們從 lucene 遷移到 ElasticSearch 時,除了重新索引所有內容外,我們別無選擇,我們使用 [功能標記](https://www.egnyte.com/blog/2015/06/scaling-elasticsearch-at-egnyte/) 進行了重新編碼 -4 個月完成。
* 模式一致性檢查器報告可確保升級后所有數據中心中的所有模式均相同。
### 您是否有單獨的運營團隊來管理您的網站?
是的,我們有一個專門的 devops 團隊和一個 IT / Ops 團隊,負責監視和管理系統。
## 其他
### 您欣賞誰?
AWS :他們的創新步伐令人贊嘆。
Google :他們的工具,例如 BigQuery,Analytics(分析)都很棒。
Elasticsearch :其余 api 的簡潔性和架構都很棒。
MySQL: 即可。
Eclipse / Jenkins :插件架構很好。
### 您是否模仿了其他人的公司/方法?
我們是 [http://highscalability.com/](http://highscalability.com/) 的常規讀者,許多設計都受到它的啟發。
* POD 架構的靈感來自 Tumblr 的 Cell 架構,雖然不完全匹配,但是隔離故障的概念是相同的。
* 受 Facebook 啟發的架構在 12 小時后會在內存緩存和刷新鍵中產生抖動。
* 受 [http://highscalability.com/上一些文章的啟發,將](http://highscalability.com/) [指紋添加到每個數據庫查詢](https://www.egnyte.com/blog/2014/10/debugging-performance-issues-in-distributed-systems/)
我們正在招聘,請在 [職位頁面](http://www.egnyte.com/jobs/engineering.html) 中查看我們,并在 [與我們聯系 [受電子郵件保護]](/cdn-cgi/l/email-protection) 。如果您有興趣成為 [Egnyte](https://www.egnyte.com) 令人驚嘆的團隊的一員。
[關于 HackerNews](https://news.ycombinator.com/item?id=11104555)
- 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 內容平臺的經驗教訓