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