# Aeron:我們真的需要另一個消息傳遞系統嗎?
> 原文: [http://highscalability.com/blog/2014/11/17/aeron-do-we-really-need-another-messaging-system.html](http://highscalability.com/blog/2014/11/17/aeron-do-we-really-need-another-messaging-system.html)

我們真的需要 [另一個](https://www.youtube.com/watch?v=dq4aOaDXIfY) 消息傳遞系統嗎? 如果它承諾使用創新的設計,以每秒一百萬微秒的延遲在機器之間以百萬微秒的延遲將數百萬條消息以一致的響應時間傳遞給大量客戶端,那么我們可能會做到。
這就是 [Aeron](https://github.com/real-logic/Aeron) (凱爾特神 戰斗,而不是主持人,盡管告訴搜索引擎),這是 [Todd Montgomery](https://twitter.com/toddlmontgomery) 團隊開發的一種新型高性能開源消息傳輸庫, 多播和可靠協議專家,編譯器優化專家 [Richard Warburton](http://insightfullogic.com/blog/) 和 [Martin Thompson [](https://twitter.com/mjpt777) ,這是面糊的表演黑幫。
聲稱 Aeron 已經在吞吐量方面擊敗了最好的產品,并且延遲匹配了最高達 90%的最佳商業產品。 Aeron 可以以每秒 600 萬條消息的速度推送 40 字節的小消息,這是非常困難的情況。
以下是馬丁在 Strangeloop 上對 Aeron 的演講: [Aeron:開源高性能消息傳遞](https://www.youtube.com/watch?v=tM4YskS94b0) 。 我將簡要介紹他的演講,并整合到本文末尾列出的信息源中。
Martin 和他的團隊處于令人羨慕的位置,擁有一個需要像 Aeron 這樣的產品的客戶,并愿意為其開發提供資金,同時也使其開源。 因此,在 GitHub 上運行 git [Aeron](https://github.com/real-logic/Aeron) 。 請注意,對于 Aeron 來說還處于初期,他們仍處于繁重的優化階段。
世界已經改變,因此端點需要前所未有的擴展。 這就是為什么馬丁說我們需要一個新的消息傳遞系統的原因。 現在是一個多面的世界。 我們擁有多核,多插槽,多云,數十億用戶計算,通訊一直在發生。 大量的消費者定期對要從同一發布者讀取的頻道進行搗亂,這會導致鎖爭用,排隊效應,從而導致吞吐量下降和延遲高峰。
我們需要一個新的消息庫來充分利用這個新世界。 [轉向微服務](https://groups.google.com/forum/#!topic/mechanical-sympathy/fr7moLcsuiI) 僅增加了需求:
當我們進入微服務世界時,我們需要從通信中獲得非常低且可預測的延遲,否則 [USL](http://www.perfdynamics.com/Manifesto/USLscalability.html) 的一致性部分將會出現 雨火和硫磺在我們的設計上。
使用 Aeron 的目標是保持事物的純正和專注。 到目前為止,我們所做的基準測試表明吞吐量和延遲方面的進步。 十分獨特的是,您不必在吞吐量和延遲之間進行選擇。 對于其他高端消息傳輸,這是一個獨特的選擇。 Aeron 使用的算法可提供最大的吞吐量,同時將直到飽和的等待時間最小化。
“許多通訊產品都是瑞士軍刀; [說](https://groups.google.com/d/msg/mechanical-sympathy/fr7moLcsuiI/IMvQY_bCQf8J) Martin,這是了解 Aeron 的好方法。 它不是您習慣的全功能消息傳遞產品,例如 [Kafka](http://kafka.apache.org/) 。 Aeron 不保留消息,不支持有保證的傳遞,也不支持群集,也不支持主題。 Aeron 不會知道客戶端是否崩潰了,也無法從歷史記錄同步備份或從歷史記錄初始化新客戶端。
將 Aeron 置于心理矩陣中的最佳方法可能是將其作為面向消息的 TCP 替代品,并在其上寫入更高級別的服務。 Todd Montgomery [擴展了](https://groups.google.com/d/msg/mechanical-sympathy/fr7moLcsuiI/XsKndzoR6ycJ) 的構想:
Aeron 是 ISO 第 4 層協議,它提供了許多消息傳遞系統無法提供的功能,也沒有提供某些消息傳遞系統可以提供的功能.... 讓我稍微解釋一下所有典型的消息傳遞系統(不僅是 Kafka 和 0MQ)。
一種更多考慮 Aeron 適合何處的方法是 TCP,但是可以選擇可靠的多播傳送。 但是,這在一定程度上是有限的,因為 Aeron 在設計上也具有許多可能的用途,這些用途遠遠超出了 TCP 的功能范圍。 以下是一些要考慮的事項:
Todd 繼續提供更多詳細信息,因此請繼續閱讀文章以了解更多有關該主題的信息。
Aeron 的核心是 **復制的消息持久記錄** 。 通過非常有意識的設計過程,消息從發布到接收的整個過程都是無等待的,零復制。 這意味著延遲非常好并且非常可預測。
總結 Aeron 簡而言之。 它是由一支經驗豐富的團隊創建的,使用了以前許多項目中都得到強化的扎實的設計原則,并得到了并非所有人都擁有的技術支持。 每個方面都經過精心設計,干凈,簡單,高性能和高度并發。
如果說簡單與聰明是無法區分的,那么 Aeron 就有很多聰明之處。 讓我們看看他們是如何做到的...
請注意,Martin Thompson 的 [這個話題](https://www.youtube.com/watch?v=tM4YskS94b0) 正在進行中。 我盡了最大的努力來捕捉想法,但是您沒有得到的感覺就是它們融合在一起的程度。 馬丁在傳達這種整體感方面做得很出色,這就是為什么這次演講值得一看。
## 其他
* *Todd Montgomery 繼續說。*。關于 Aeron 適合何處的一種思考方式是 TCP,但可以選擇可靠的多播傳遞。 但是,這在一定程度上是有限的,因為 Aeron 在設計上也具有許多可能的用途,這些用途遠遠超出了 TCP 的功能范圍。 這里有幾件事情要考慮:
* 及時識別具有完整記錄邊界的“持久”數據流。 這是{channel,sessionId,channelId,offset,length}元組,它是日志緩沖區策略的核心。 這使得具有任意回放的流的非易失性存儲能夠掉出……這非常有趣。 這導致以真正機械的同情方式進行數據流的重新連接和持久化。 我對此壓力太大了。 實際上,這也為傳輸協議提供了真正的位置透明性。 即本地訂戶可以直接從發布者的日志緩沖區中讀取,而驅動程序則透明地將數據發送給現成的訂戶。 到目前為止,我們已經確定了這些內容,但是我認為這也可以應用于處理主動/被動前??向糾錯,輪播,任意重放等的獨特方法。
* Aeron 沒有主題。 它具有單獨的非競爭流。 大多數消息傳遞系統都提供主題空間。 這是一種祝福和詛咒。 通過為 Aeron 故意保留有界的實現方式(但不受設計限制)的流空間,Aeron 允許在頂部構建主題空間(這使 0MQ 和許多其他系統可以利用它)而不會將實現鎖定在浪費資源上 對于那些不需要它的用例。
* 可靠的單播設計是一種模仿 TCP 的熟悉的防火墻可穿越設計。 但是可靠的多播設計允許發布/訂閱語義具有無限可配置的流控制策略。 這不僅提供了普通的消息傳遞,流傳輸等各種用例可能性。
* 傳輸媒體已更改。 消息不再只是通過 TCP。 更多的多播正在發生。 Infiniband 正在高性能領域起飛。 [PCI Express](http://en.wikipedia.org/wiki/PCI_Express) 3.0 具有內置的內存模型,因此可以在計算機之間的總線之間傳輸字節。 這就是許多高性能空間的去向。
* 我們需要在同一臺機器上的進程和套接字之間進行通信。 隨著使用越來越多的內核構建機器,它們實際上成為了一個盒子中的數據中心。 英特爾的新款 [Haswell CPU](http://www.extremetech.com/computing/189518-intels-new-18-core-haswell-xeon-chips-will-try-to-preempt-the-arm-server-onslaught) 每個插槽具有 18 個內核,每個內核具有兩個超線程。 在一臺計算機上可能同時運行 240 個線程,我們需要一種方法來分工并有效地進行通信。
* 用純 Java 8 編寫,并利用了該版本新引入的 lambda 表達式。
* 對等而不是代理解決方案,這是它具有如此低的延遲的原因之一。
* 使用 UDP 并將很快擁有 SHM IPC 和 Infiniband。
* 構建高性能系統的秘訣在于簡單性。 復雜性會降低性能。 追求簡潔的簡潔設計。
* 通過提供替代算法提供帶有可插拔鉤子的自己的流控制。
* 不支持群集和存檔的消息,盡管將來的項目可能會添加一些此功能。
* 可靠的多播傳遞。
* Aeron 本質上將日志緩沖區從一臺機器復制到另一臺機器。 從功能上來說,緩沖區是持久的,因為存儲的記錄不會發生突變,也不會持久存儲到磁盤。
* 提供可靠的交貨,但不能保證。 如果訂戶死亡并超時,則將不會重試消息傳遞。 可以在 Aeron 之上分層協議以存檔已發布的消息,以便訂戶可以恢復,但這不在基本功能之內。
* 不提供交易擔保。 因此,要約完成后,當要約返回時,要么被拒絕,要么被放置在共享內存日志緩沖區中,由驅動程序發送。 在流量控制允許的范圍內,驅動程序會盡力發送。 但是,Aeron 確實盡力將其提供給訂戶。 這是一種盡力而為的傳遞保證,就像 TCP 一樣,但是要好一點,因為它可以處理 TCP 無法實現的某些連接故障。 但這并不能保證。
* 為了測試捕獲完整的等待時間直方圖,同時嘗試多個線程同時發布從而發生競爭的情況。 還要與許多其他消息傳遞因素進行比較。 例如 IPC /單播/多播,不同的消息大小等。
## 基本操作
* 發布者通過一個頻道發送消息,供訂閱者閱讀。 頻道內是流向訂戶的流。
* 通道保持消息有序。 信息流彼此獨立,因此它們不會相互阻塞。
* 檢測到損失并以對延遲和吞吐量的最小影響進行處理。
* 使用流量控制和背壓以免淹沒客戶。
* 擁塞避免和控制處理經過擁塞網絡的數據包。 它被認為是高性能領域中的一項可選服務。 當發生擁塞時,需要此服務,但是在等待時間需要盡可能低的情況下,擁塞控制算法會使您減速。 一個示例是 TCP 的 [慢啟動](http://en.wikipedia.org/wiki/Slow-start) 問題,因為 TCP 試圖避免用流量淹沒網絡。
* 在處理非常大的消息,處理碎片并避免 [行頭阻塞](http://en.wikipedia.org/wiki/Head-of-line_blocking) 的同時,在通道中對流進行多路復用和多路分解。
* 不是框架,而是圖書館。 這是一種可組合的設計,因此可以在其之上構建其他層。
* 設計大約涉及三件事:系統架構,數據結構和協議交互。
* 正確構建架構,并使其美觀整潔。
* 數據結構非常重要。
* 如今,人們不再強調良好的協議工作,這是分布式代理進行通信和合作時的基礎。
## 架構 [
* 發布者發布,訂閱者訂閱。 您可以在兩臺計算機之間進行雙向通信,但是每臺計算機都需要分別注冊一個發布者和一個訂閱者。 一對發布者和訂閱者只是一種通信方式。
* 通信通過 UDP,UDP 多播,Infiniband,PCI-e 3.0,RDMA 等媒體進行。
* 發送者負責通過媒體發送數據,而接收者則通過媒體接收數據。 發送者和接收者是在各自的線程中運行各自工作的獨立代理。 現代處理器確實擅長于一遍又一遍地執行相同的操作,因為它們的高速緩存中存儲著指令和數據。
* 導體是獨立的代理,可以完成所有不在 A 和 B 之間發送字節的工作。這包括內部管理和管理員(如用戶設置,新出版物的事件,新的訂閱以及告訴系統正在發生的事情)。
* 發送方和接收方保持非常簡單和整潔,因此它們可以使用最佳方法在媒體上的兩點之間盡快傳輸數據。
* 在同一進程中沒有共享數據結構。 通信正在使用消息傳遞。 導體使用消息通過非阻塞結構進行通信。 這允許使用干凈的單線程代碼,該代碼可以運行得很快。 避免了并發和使用隊列的鎖定。
* 明確分開的關注點意味著可以選擇零件的放置位置。 它們都是獨立的代理程序,具有自己的線程,運行自己的代碼,具有自己的內部數據結構,這些數據結構不共享,因此它們不需要并發,不需要鎖,因此可以實現令人難以置信的執行 快速。
* 導體分為為發送者和接收者提供服務所需的內容以及為客戶端提供服務所需的內容。 而且由于通訊不使用共享內存,而是在隊列中,因此可以將 Conductor 的這些部分拆分為單獨的進程。 媒體驅動程序可以處于自己的進程中,客戶端可以處于其自己的進程中。 或者,媒體驅動程序可能位于內核中。 或在 FPGA 中。
## 數據結構
* Java 中的數據結構過于復雜,間接性太多,這意味著性能低下,因此他們構建了自己的映射,IPC 環形緩沖區,IPC 廣播緩沖區,ITC 隊列,動態數組,日志緩沖區。
* 環形緩沖區用于在導體,客戶端和驅動程序之間進行通信。
* 還需要將事件從驅動程序發送到多個客戶端,而不會降低驅動程序的速度,而不考慮客戶端的數量,因此廣播用于事件。
* 許多數據結構在動態變化,例如給定訂閱的訂閱者數量,發布的發布者數量,這些數據結構必須是動態的且無阻塞的。 日志緩沖區用于將消息從發布移動到訂閱。
## 永久日志
* 消息與標頭一起存儲在持久日志結構中。 (更多關于日志結構[在此處](http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying)的介紹)。
* 日志已映射到磁盤,但使用內存映射文件保存在內存中。 日志活在文件中,因為文件可跨進程使用。 文件被映射到內存中,從而避免了必須進行系統調用才能進入磁盤的過程。
* 不變的數據結構可以安全無鎖地讀取,因為它們會隨著時間增長。
* 描述了添加消息的協議和狀態機。 添加消息不涉及任何鎖。
* 首先,將尾部原子地向前移動,以便另一個線程可以在同一時間添加一條消息。
* 現在可以添加消息了。 該消息被復制到緩沖區。
* 為了表示一條消息已完成,將單個字操作寫入消息頭中的字段。
* 消息標頭已完全寫入日志,因此向發送方發送消息只需要編寫標頭和消息的連續字節,無需動態編寫,因此將消息發送至發布者非常有效 很多客戶。
* 日志不僅僅是隨時間增長的單個文件。 單一文件設計雖然很常見,但存在很多問題。 因為頁面錯誤會一直發生,并且頁面錯誤非常昂貴,這會增加 VM 壓力和頁面攪動(這是 [頁面錯誤成本](https://plus.google.com/+LinusTorvalds/posts/YDKRFDwHwr6) 上的 Linus Torvalds) )。 頁面錯誤并沒有變得越來越快,過程也越來越快,因此差距是巨大的(盡管這一直是正確的,為什么頁面錯誤總是要避免的原因)。
* 單個文件方法的替代方法是保留三個緩沖區:干凈,臟,活動。 活動緩沖區是您正在寫入的緩沖區。 骯臟是永恒的歷史。 清除是下一個變為活動狀態的緩沖區。 導體可以在后臺進行清理,因此寫入它們不會造成等待時間的損失。 緩沖區在緩存中都很熱,因此沒有頁面緩存正在進行。 另一個線程可以將臟緩沖區存檔到另一個數據存儲中,以便可以永久保存消息。
* 這是免等待時間的實現方式。 假設有兩個編寫者試圖在兩個不同的線程中由兩個不同的發布者同時將消息 X 和 Y 寫入日志,可能是在不同的過程中寫入同一驅動程序。 由于驅動程序用盡了進程,因此可以在多個進程之間共享。 Y 贏得比賽以增加尾巴。 然后 X 遞增尾部,但是尾部越過緩沖區的末端。 Y 可以使用它分配的空間。 填充記錄放置在 Y 的末尾與緩沖區的末尾之間,因此緩沖區始終是連續且完整的。 X 負責旋轉到下一個緩沖區,在該緩沖區中它將消息從緩沖區的開頭寫入新的尾部。 所有這些工作并沒有導致線程的任何延遲。 它完全獨立發生,沒有阻塞操作。 如果某個進程中斷,則其他所有線程均不會阻塞。
## 發送消息 ,
* 標頭包含版本信息; 旗; 消息類型; 幀長 術語“偏移量”,即到緩沖區的偏移量,這是將其復制到另一端的位置; 會話 ID,流 ID; 條款 ID; 編碼的消息。 所需的所有內容都在標頭中,因此可以將其直接寫入網絡。 寫入幀長字節后,消息已發送。
* 標頭設計的有趣含義是,流中的每個字節在整個時間上都有唯一的標識符,這是 streamId,sessionId,termId,termOffset 的復合鍵。 稍后將使用此功能,以便接收者可以告訴發送者日志的哪個區域被刪除,因此發送者可以從該點重新發送。
* 使用消息協議在發送方和接收方之間復制日志。 發送方要發送消息時,會向接收方發送設置消息。 接收方發回狀態消息。 發送方開始向接收方發送數據。 接收方發送更多狀態消息,告訴發送方它還有 X 的剩余空間,因此您可以繼續發送。 消息不被確認,NAK 代替。 為了最小化[內爆效應](ftp://www-net.cs.umass.edu/pub/Rubenst98:Proact-TR-98-19.ps.gz),大多數現代組播協議使用 NAK 代替 ACK。 接收者告訴發送者它還剩下多少空間,這比基于 ack 的方法所需的消息更少。 它為您提供了一種實現流量控制和背壓的機制。
* 發送方將其作為心跳發送的最后一條消息發送給接收方。 這種方法還可以處理丟棄最后一條消息的情況(請記住,正在使用 UDP)。
* 當接收者知道有一條消息被丟棄時,它將向發送者發送一個 NAK,用于查找丟失的術語區域。 在這一點上,請記住,正在復制的是日志,因此接收方可以假定整個日志可用,而不僅僅是很小的窗口大小。
* 接收者具有發送者中相同數據結構的副本。 標頭和消息被寫入日志。 有兩個計數器:已完成和高水位標記。 假設已寫入消息 1,消息 3 出現在消息 2 之前,因為存在訂購問題。 完成的計數器指向消息 1 的末尾。高水位標記指向消息 3 的末尾。消息 2 應該有一個孔。 已完成指向連續的消息流。 如果消息 2 到達完成,則向前移動以指向消息 3 的末尾。
* 使用這種方法,您無需保留遺漏郵件的跳過列表或歷史記錄中有空白的地方。 這些額外的數據結構很復雜,而且速度很慢。 它們導致并發問題和高速緩存未命中。
* 日志緩沖區在內存中是完全線性的。 訪問它們只需要向前邁進內存,這確實是硬件友好的。 指針追逐在性能上確實很糟糕,因為它們會導致頁面錯誤。
* 此表示形式也非常緊湊。 您可以通過記憶尖叫。
* 此設計是回到基礎的結果。 考慮如何解決丟失,重新排序,保留歷史記錄,同時保持內存和并發友好的問題。 結果是一個持久的數據結構,其速度比任何現有方法都要快。 [持久數據結構](http://en.wikipedia.org/wiki/Persistent_data_structure) 是一種數據結構,在修改后始終保留其自身的先前版本。 從軌道的功能角度來看,這是一個想法。 學科合作時,有很多東西要學習。 只執行功能性技術或忽略功能性技術是愚蠢的。
* 導體始終在完成和高水位線之間尋找間隙。 它將發送 NAK,因此發送方將重新發送日志的該部分。 這是簡單且易于調試的。
* 要了解消耗了哪些消息,請使用指向字節流中某個位置的計數器。 發布者,發送者,接收者和訂閱者都在字節流中保留位置計數器。 這使得監視,應用流量控制和擁塞控制變得容易。 這些計數器在另一個內存映射文件中可用,因此它們可用于單獨的監視應用程序。
* 協議很難。 您需要注意大規模的自相似行為。 例如,在多播世界中,當出現問題時,您會得到一種稱為自相似行為的信息,這種行為會開始發生模式并建立起共振。 因此必須將隨機性注入系統。 NAK 必須在將來的某個隨機點發送。 這樣可以防止訂戶立即全部錘擊源。
## 吸取的教訓 [
* **人們以** n 估算值吸吮。 即使有團隊的豐富經驗,他們的估計也全都沒有了。 估算只是人類不擅長的事情。
* **構建分布式系統非常困難** 。 只有不想構建分布式系統的人才有資格構建一個分布式系統,因為他們至少對工作的辛苦程度有所了解。 您只是不能說嘿,讓我們創建一個分布式的并發系統。 首先制作一個單線程系統,然后再進行其余工作。
* **我們的防御代碼比特征代碼** 更多。 在分布式系統上,事情可能會大規模出錯,并且那些故障需要得到處理。 這并不意味著代碼中充滿了異常處理程序。 他們知道很多失敗案例,但是仍然有很多防御性代碼。
* **建立分布式系統是對** 的獎勵。 看到整個機器網絡針對注入的故障進行調整并全部得到糾正是一件很美好的事情。
* **從一開始就設計監視和調試** 。 從一開始就讓一切可見。 無鎖方法的優點之一是,您實際上可以從另一個線程觀察狀態,這使調試更加容易。
* **由于配置** ,我們將 3x-4x 的性能留在桌面上。 程序員和系統管理員的分離是一種反模式。 開發人員不會與沒有 root 訪問權限的人交談,而不會與擁有網絡訪問權限的人交談。 這意味著系統永遠不會配置正確,這會導致大量數據包丟失。 丟失,吞吐量和緩沖區大小都與 密切相關。 我們需要鍛煉如何彌合差距,知道參數是什么,以及如何解決它們。 因此 知道您的 OS 網絡參數以及如何對其進行調整 。
* **Java 的某些部分確實很爛** 。 無符號類型; NIO 系統布滿了鎖; 很難在沙盒模型中進行堆外工作并獲得所需的性能; 字符串編碼不應要求復制緩沖區三次; 有些人是成年人,讓我們映射和取消映射內存映射文件,并像成年人一樣使用套接字。 哈希圖周圍的垃圾回收問題是痛苦的; 或字節標志會將字節提升為整數,因此您無法將結果分配回一個字節;
* **Java 的不錯部分** 。 工具。 Java 是世界上最糟糕的語言,擁有世界上最好的工具鏈:IDE,Gradle,HdrHistogram。 Java 的 lambda 和方法句柄非常好。 字節碼檢測對于調試確實很有用。 例如,Java 8 中的不安全性非常好,這就是計數器無鎖遞增的方式,并且可以在 CPU 上很好地擴展,并且內存柵欄使構建廣播緩沖區成為可能。 優化器很棒。 垃圾回收對于某些類的算法非常有用。
* **平均值絕對沒有意義** 。 注意百分位數。
## 未來 [
* 現在功能已完成。 現在進行大量的分析和優化。
* 情況看起來很好。 在吞吐量方面已經擊敗了最好的產品。 可以以每秒 600 萬條消息的速度發送 40 字節的小消息,這是非常困難的情況。 時延看起來很棒,那里有最好的商業產品,高達 90%。 除了 90%的百分位數之外,還有很多工作要做,部分是基于算法,??還有 NIO,選擇器和鎖。
* 接下來是 C ++端口。
* Infiniband 和 IPC。
## 相關文章
* [在 Reddit](http://www.reddit.com/r/programming/comments/2ml0gb/aeron_do_we_really_need_another_messaging_system/) 上/ [在黑客新聞](https://news.ycombinator.com/item?id=8619735)上
* [Aeron 高性能開源消息傳輸](http://gotocon.com/dl/goto-berlin-2014/slides/MartinThompson_AeronTheNextGenerationInOpenSourceHighPerformanceMessaging.pdf)
* [Martin Ahompson 撰寫的“ Aeron:開源高性能消息傳遞”](https://www.youtube.com/watch?v=tM4YskS94b0)
* [GitHub 上的 Aeron](https://github.com/real-logic/Aeron)
* Aeron [協議規范](https://github.com/real-logic/Aeron/wiki/Protocol-Specification) 和 [設計概述](https://github.com/real-logic/Aeron/wiki/Design-Overview) 。
* [日志:每位軟件工程師應了解的有關實時數據統一抽象的知識](http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying)
* [Google:馴服長時間延遲的尾巴-當更多的機器等于更差的結果時](http://highscalability.com/blog/2012/3/12/google-taming-the-long-latency-tail-when-more-machines-equal.html)
* [偉大的微服務與整體應用 Twitter 近戰](http://highscalability.com/blog/2014/7/28/the-great-microservices-vs-monolithic-apps-twitter-melee.html)
* [簡單二進制編碼](http://mechanical-sympathy.blogspot.com/)
* [本周要去 Strangeloop 嗎? 您的“必看”清單上有哪些講座?](https://groups.google.com/forum/#!topic/mechanical-sympathy/fr7moLcsuiI)
* [Aeron 性能測試](https://groups.google.com/forum/#!topic/mechanical-sympathy/GrEce0gP7RU)
* [策略:利用處理器親和力實現高性能和可預測的性能](http://highscalability.com/blog/2012/3/29/strategy-exploit-processor-affinity-for-high-and-predictable.html)
* [12 種將吞吐量提高 32 倍,將延遲降低 20 倍的方法](http://highscalability.com/blog/2012/5/2/12-ways-to-increase-throughput-by-32x-and-reduce-latency-by.html)
* [破壞了 4 個現代硬件神話-內存,HDD 和 SSD 真的是隨機訪問嗎?](http://highscalability.com/blog/2013/6/13/busting-4-modern-hardware-myths-are-memory-hdds-and-ssds-rea.html)
* [對 Apache Kafka 進行基準測試:每秒 200 萬次寫入(在三臺便宜的機器上)](http://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)
* [HdrHistogram](https://github.com/HdrHistogram/HdrHistogram) -高動態范圍(HDR)直方圖。
非常感謝您提供大量信息來總結并做得很好,但是聲明“發布者和訂閱者之間的全雙工通信”并不是很準確。 發布者發布,訂閱者訂閱。 您可以在兩臺計算機之間進行雙向通信,但是每臺計算機都需要分別注冊一個發布者和一個訂閱者。 一對發布者和訂閱者只是一種通信方式。
另外,當您說“并非所有郵件都被確認”時,我們不會確認數據包。 我們使用 NAK 代替,我的理解是實際上大多數現代多播協議使用 NAK 代替 ACK 來最小化內爆效應。
太好了,謝謝理查德的改正!
“面對面”,認真嗎?
是的,我猜這翻譯得不好。 它引用了猶他爵士樂團的約翰·斯托克頓(John Stockton),他是 NBA 歷史上最好的球員之一。 因此,這是一個受人尊敬的術語,這就是它的意思。
- 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 內容平臺的經驗教訓