Java开发自学教程!java从入门到精通txt下载
1、背景
首先,讓我們簡要地討論下每個系統,以了解它們的高級設計和架構,看下每個系統所做的權衡。
Kafka 是一個開源的分布式事件流處理平臺,也是 Apache 軟件基金會下五個最活躍的項目之一。在其核心,Kafka 被設計成一個多副本的分布式持久化提交日志,用于支撐事件驅動的微服務或大規模流處理應用程序。客戶端向代理集群提供事件或使用代理集群的事件,而代理會向底層文件系統寫入或從底層文件系統讀取事件,并自動在集群中同步或異步地復制事件,以實現容錯性和高可用性。
Pulsar 是一個開源的分布式發布 / 訂閱消息系統,最初是服務于隊列用例的。最近,它又增加了事件流處理功能。Pulsar 被設計為一個(幾乎)無狀態代理實例層,它連接到單獨的 BookKeeper 實例層,由它實際地讀取 / 寫入消息,也可以選擇持久地存儲 / 復制消息。Pulsar 并不是唯一的同類系統,還有其他類似的消息傳遞系統,如 Apache DistributedLog 和 Pravega,它們都是在 BookKeeper 之上構建的,也是旨在提供一些類似 Kafka 的事件流處理功能。
BookKeeper 是一個開源的分布式存儲服務,最初是為 Apache Hadoop 的 NameNode 而設計的預寫日志。它跨服務器實例 bookies,在 ledgers 中提供消息的持久存儲。為了提供可恢復性,每個 bookie 都會同步地將每條消息寫入本地日志,然后異步地寫入其本地索引 ledger 存儲。與 Kafka 代理不同,bookie 之間不進行通信,BookKeeper 客戶端使用 quorum 風格的協議在 bookie 之間復制消息。
RabbitMQ 是一個開源的傳統消息中間件,它實現了 AMQP 消息標準,滿足了低延遲隊列用例的需求。RabbitMQ 包含一組代理進程,它們托管著發布消息的“交換器”,以及從中消費消息的隊列。可用性和持久性是其提供的各種隊列類型的屬性。經典隊列提供的可用性保證最少。經典鏡像隊列將消息復制到其他代理并提高可用性。最近引入的仲裁隊列提供了更強的持久性,但是以性能為代價。由于這是一篇面向性能的博文,所以我們將評估限制在經典隊列和鏡像隊列。
2、分布式系統的持久性
單節點存儲系統(例如 RDBMS)依靠 fsync 寫磁盤來確保最大的持久性。但在分布式系統中,持久性通常來自復制,即數據的多個副本獨立失效。數據 fsync 只是在發生故障時減少故障影響的一種方法(例如,更頻繁地同步可能縮短恢復時間)。相反,如果有足夠多的副本失敗,那么無論是否使用 fsync,分布式系統都可能無法使用。因此,我們是否使用 fsync 只是這樣一個問題,即每個系統選擇基于什么方式來實現其復制設計。有些系統非常依賴于從不丟失寫入到磁盤的數據,每次寫入時都需要 fsync,但其他一些則是在其設計中處理這種情況。
Kafka 的復制協議經過精心設計,可以確保一致性和持久性,而無需通過跟蹤什么已 fsync 到磁盤什么未 fsync 到磁盤來實現同步 fsync。Kafka 假設更少,可以處理更大范圍的故障,比如文件系統級的損壞或意外的磁盤移除,并且不會想當然地認為尚不知道是否已 fsync 的數據是正確的。Kafka 還能夠利用操作系統批量寫入磁盤,以獲得更好的性能。
我們還不能十分確定,BookKeeper 是否在不 fsync 每個寫操作的情況下提供了相同的一致性保證——特別是在沒有同步磁盤持久化的情況下,它是否可以依賴復制來實現容錯。關于底層復制算法的文檔或文章中沒有提及這一點。基于我們的觀察,以及 BookKeeper 實現了一個分組 fsync 算法的事實,我們相信,它確實依賴于 fsync 每個寫操作來確保其正確性,但是,社區中可能有人比我們更清楚我們的結論是否正確,我們希望可以從他們那里獲得反饋。
無論如何,由于這可能是一個有爭議的話題,所以我們分別給出了這兩種情況下的結果,以確保我們的測試盡可能的公平和完整,盡管運行帶有同步 fsync 功能的 Kafka 極其罕見,也是不必要的。
3、基準測試框架
對于任何基準測試,人們都想知道使用的是什么框架以及它是否公平。為此,我們希望使用 OpenMessaging Benchmark Framework(OMB),該框架很大一部分最初是由 Pulsar 貢獻者編寫的。OMB 是一個很好的起點,它有基本的工作負載規范、測試結果指標收集 / 報告,它支持我們選擇的三種消息系統,它還有針對每個系統定制的模塊化云部署工作流。但是需要注意,Kafka 和 RabbitMQ 實現確實存在一些顯著的缺陷,這些缺陷影響了這些測試的公平性和可再現性。最終的基準測試代碼,包括下面將要詳細介紹的修復程序,都是開源的。
OMB 框架修復
我們升級到 Java 11 和 Kafka 2.6、RabbitMQ 3.8.5 和 Pulsar 2.6(撰寫本文時的最新版本)。借助 Grafana/Prometheus 監控棧,我們顯著增強了跨這三個系統的監控能力,讓我們可以捕獲跨消息系統、JVM、Linux、磁盤、CPU 和網絡的指標。這很關鍵,讓我們既能報告結果,又能解釋結果。我們增加了只針對生產者的測試和只針對消費者的測試,并支持生成 / 消耗積壓,同時修復了當主題數量小于生產者數量時生產者速率計算的一個重要 Bug。
OMB Kafka 驅動程序修復
我們修復了 Kafka 驅動程序中一個嚴重的 Bug,這個 Bug 讓 Kafka 生產者無法獲得 TCP 連接,存在每個工作者實例一個連接的瓶頸。與其他系統相比,這個補丁使得 Kafka 的數值更公平——也就是說,現在所有的系統都使用相同數量的 TCP 連接來與各自的代理通信。我們還修復了 Kafka 基準消費者驅動程序中的一個關鍵 Bug,即偏移量提交的過于頻繁及同步導致性能下降,而其他系統是異步執行的。我們還優化了 Kafka 消費者的 fetch-size 和復制線程,以消除在高吞吐量下獲取消息的瓶頸,并配置了與其他系統相當的代理。
OMB RabbitMQ 驅動程序修復
我們增強了 RabbitMQ 以使用路由鍵和可配置的交換類型(DIRECT交換和TOPIC交換),還修復了 RabbitMQ 集群設置部署工作流中的一個 Bug。路由鍵被引入用來模仿主題分區的概念,實現與 Kafka 和 Pulsar 相當的設置。我們為 RabbitMQ 部署添加了一個 TimeSync 工作流,以同步客戶端實例之間的時間,從而精確地測量端到端延遲。此外,我們還修復了 RabbitMQ 驅動程序中的另一個 Bug,以確保可以準確地測量端到端延遲。
OMB Pulsar 驅動程序修復
對于 OMB Pulsar 驅動程序,我們添加了為 Pulsar 生產者指定最大批次大小的功能,并關閉了那些在較高目標速率下、可能人為地限制跨分區生產者隊列吞吐量的全局限制。我們不需要對 Pulsar 基準驅動程序做任何其他重大的更改。
4、測試平臺
OMB 包含基準測試的測試平臺定義(實例類型和 JVM 配置)和工作負載驅動程序配置(生產者 / 消費者配置和服務器端配置),我們將其用作測試的基礎。所有測試都部署了四個驅動工作負載的工作者實例,三個代理 / 服務器實例,一個監視實例,以及一個可選的、供 Kafka 和 Pulsar 使用的三實例 Apache ZooKeeper 集群。在實驗了幾種實例類型之后,我們選定了網絡 / 存儲經過優化的 Amazon EC2 實例,它具有足夠的 CPU 內核和網絡帶寬來支持磁盤 I/O 密集型工作負載。在本文接下來的部分,我們會列出我們在不同的測試中對這些基線配置所做的更改。
磁盤
具體來說,我們選擇了i3en.2xlarge(8 vCore,64GB RAM,2x 2500 GB NVMe SSD),我們看中了它高達 25 Gbps 的網絡傳輸限額,可以確保測試設置不受網絡限制。這意味著這些測試可以測出相應服務器的最大性能指標,而不僅僅是網速多快。i3en.2xlarge實例在兩塊磁盤上支持高達 約 655 MB/s 的寫吞吐量,這給服務器帶來了很大的壓力。有關詳細信息,請參閱完整的 實例類型定義。根據一般建議和最初的 OMB 設置,Pulsar 把一個磁盤用于 journal,另一個用于 ledger 存儲。Kafka 和 RabbitMQ 的磁盤設置沒有變化。
最后
需要的朋友可以點擊:戳這里免費領取。
還有Java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板可以領取+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書+2021年最新大廠面試題。
團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書+2021年最新大廠面試題。
總結
以上是生活随笔為你收集整理的Java开发自学教程!java从入门到精通txt下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android contacts 源码分
- 下一篇: oracle instant clien