kafka的基礎原理和作用

這篇文章主要講解了“kafka的基礎原理和作用”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“kafka的基礎原理和作用”吧!

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供社旗網(wǎng)站建設、社旗做網(wǎng)站、社旗網(wǎng)站設計、社旗網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、社旗企業(yè)網(wǎng)站模板建站服務,10余年社旗做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

Kafka作為一個分布式的流平臺,這到底意味著什么?

我們認為,一個流處理平臺具有三個關鍵能力:

  1. 發(fā)布和訂閱消息(流),在這方面,它類似于一個消息隊列或企業(yè)消息系統(tǒng)。

  2. 容錯的方式存儲消息(流)。

  3. 在消息流發(fā)生時處理它們。

什么是kakfa的優(yōu)勢?它主要應用于2大類應用:

  1. 構建實時的流數(shù)據(jù)管道,可靠地獲取系統(tǒng)和應用程序之間的數(shù)據(jù)。

  2. 構建實時流的應用程序,對數(shù)據(jù)流進行轉(zhuǎn)換或反應。

要了解kafka是如何做這些事情的,讓我們從下到上深入探討kafka的能力。

首先幾個概念:

  1. kafka作為一個集群運行在一個或多個服務器上。

  2. kafka集群存儲的消息是以topic為類別記錄的。

  3. 每個消息(也叫記錄record,我習慣叫消息)是由一個key,一個value和時間戳構成。

kafka有四個核心API:

  • 應用程序使用 Producer API 發(fā)布消息到1個或多個topic(主題)。

  • 應用程序使用 Consumer API 來訂閱一個或多個topic,并處理產(chǎn)生的消息。

  • 應用程序使用 Streams API 充當一個流處理器,從1個或多個topic消費輸入流,并生產(chǎn)一個輸出流到1個或多個輸出topic,有效地將輸入流轉(zhuǎn)換到輸出流。

  • Connector API允許構建或運行可重復使用的生產(chǎn)者或消費者,將topic連接到現(xiàn)有的應用程序或數(shù)據(jù)系統(tǒng)。例如,一個關系數(shù)據(jù)庫的連接器可捕獲每一個變化。

kafka的基礎原理和作用

Client和Server之間的通訊,是通過一條簡單、高性能并且和開發(fā)語言無關的TCP協(xié)議。并且該協(xié)議保持與老版本的兼容。Kafka提供了Java Client(客戶端)。除了Java Client外,還有非常多的其它編程語言的Client。

首先來了解一下Kafka所使用的基本術語:

Topic

Kafka將消息種子(Feed)分門別類,每一類的消息稱之為一個主題(Topic).

Producer

發(fā)布消息的對象稱之為主題生產(chǎn)者(Kafka topic producer)

Consumer

訂閱消息并處理發(fā)布的消息的種子的對象稱之為主題消費者(consumers)

Broker

已發(fā)布的消息保存在一組服務器中,稱之為Kafka集群。集群中的每一個服務器都是一個代理(Broker). 消費者可以訂閱一個或多個主題(topic),并從Broker拉數(shù)據(jù),從而消費這些已發(fā)布的消息。

主題和日志 (Topic和Log)

讓我們更深入的了解Kafka中的Topic。

Topic是發(fā)布的消息的類別或者種子Feed名。對于每一個Topic,Kafka集群維護這一個分區(qū)的log,就像下圖中的示例:

kafka的基礎原理和作用

每一個分區(qū)都是一個順序的、不可變的消息隊列, 并且可以持續(xù)的添加。分區(qū)中的消息都被分了一個序列號,稱之為偏移量(offset),在每個分區(qū)中此偏移量都是唯一的。

Kafka集群保持所有的消息,直到它們過期, 無論消息是否被消費了。 實際上消費者所持有的僅有的元數(shù)據(jù)就是這個偏移量,也就是消費者在這個log中的位置。 這個偏移量由消費者控制:正常情況當消費者消費消息的時候,偏移量也線性的的增加。但是實際偏移量由消費者控制,消費者可以將偏移量重置為更老的一個偏移量,重新讀取消息。 可以看到這種設計對消費者來說操作自如, 一個消費者的操作不會影響其它消費者對此log的處理。 再說說分區(qū)。Kafka中采用分區(qū)的設計有幾個目的。一是可以處理更多的消息,不受單臺服務器的限制。Topic擁有多個分區(qū)意味著它可以不受限的處理更多的數(shù)據(jù)。第二,分區(qū)可以作為并行處理的單元,稍后會談到這一點。
kafka的基礎原理和作用

分布式(Distribution)

Log的分區(qū)被分布到集群中的多個服務器上。每個服務器處理它分到的分區(qū)。 根據(jù)配置每個分區(qū)還可以復制到其它服務器作為備份容錯。 每個分區(qū)有一個leader,零或多個follower。Leader處理此分區(qū)的所有的讀寫請求,而follower被動的復制數(shù)據(jù)。如果leader宕機,其它的一個follower會被推舉為新的leader。 一臺服務器可能同時是一個分區(qū)的leader,另一個分區(qū)的follower。 這樣可以平衡負載,避免所有的請求都只讓一臺或者某幾臺服務器處理。

Geo-Replication(異地數(shù)據(jù)同步技術)

Kafka MirrorMaker為群集提供geo-replication支持。借助MirrorMaker,消息可以跨多個數(shù)據(jù)中心或云區(qū)域進行復制。 您可以在active/passive場景中用于備份和恢復; 或者在active/passive方案中將數(shù)據(jù)置于更接近用戶的位置,或數(shù)據(jù)本地化。

生產(chǎn)者(Producers)

生產(chǎn)者往某個Topic上發(fā)布消息。生產(chǎn)者也負責選擇發(fā)布到Topic上的哪一個分區(qū)。最簡單的方式從分區(qū)列表中輪流選擇。也可以根據(jù)某種算法依照權重選擇分區(qū)。開發(fā)者負責如何選擇分區(qū)的算法。

消費者(Consumers)

通常來講,消息模型可以分為兩種, 隊列和發(fā)布-訂閱式。 隊列的處理方式是 一組消費者從服務器讀取消息,一條消息只有其中的一個消費者來處理。在發(fā)布-訂閱模型中,消息被廣播給所有的消費者,接收到消息的消費者都可以處理此消息。Kafka為這兩種模型提供了單一的消費者抽象模型: 消費者組 (consumer group)。 消費者用一個消費者組名標記自己。 一個發(fā)布在Topic上消息被分發(fā)給此消費者組中的一個消費者。 假如所有的消費者都在一個組中,那么這就變成了queue模型。 假如所有的消費者都在不同的組中,那么就完全變成了發(fā)布-訂閱模型。 更通用的, 我們可以創(chuàng)建一些消費者組作為邏輯上的訂閱者。每個組包含數(shù)目不等的消費者, 一個組內(nèi)多個消費者可以用來擴展性能和容錯。正如下圖所示:
kafka的基礎原理和作用2個kafka集群托管4個分區(qū)(P0-P3),2個消費者組,消費組A有2個消費者實例,消費組B有4個。

正像傳統(tǒng)的消息系統(tǒng)一樣,Kafka保證消息的順序不變。 再詳細扯幾句。傳統(tǒng)的隊列模型保持消息,并且保證它們的先后順序不變。但是, 盡管服務器保證了消息的順序,消息還是異步的發(fā)送給各個消費者,消費者收到消息的先后順序不能保證了。這也意味著并行消費將不能保證消息的先后順序。用過傳統(tǒng)的消息系統(tǒng)的同學肯定清楚,消息的順序處理很讓人頭痛。如果只讓一個消費者處理消息,又違背了并行處理的初衷。 在這一點上Kafka做的更好,盡管并沒有完全解決上述問題。 Kafka采用了一種分而治之的策略:分區(qū)。 因為Topic分區(qū)中消息只能由消費者組中的唯一一個消費者處理,所以消息肯定是按照先后順序進行處理的。但是它也僅僅是保證Topic的一個分區(qū)順序處理,不能保證跨分區(qū)的消息先后處理順序。 所以,如果你想要順序的處理Topic的所有消息,那就只提供一個分區(qū)。

Kafka的保證(Guarantees)

  • 生產(chǎn)者發(fā)送到一個特定的Topic的分區(qū)上,消息將會按照它們發(fā)送的順序依次加入,也就是說,如果一個消息M1和M2使用相同的producer發(fā)送,M1先發(fā)送,那么M1將比M2的offset低,并且優(yōu)先的出現(xiàn)在日志中。

  • 消費者收到的消息也是此順序。

  • 如果一個Topic配置了復制因子(replication factor)為N, 那么可以允許N-1服務器宕機而不丟失任何已經(jīng)提交(committed)的消息。

有關這些保證的更多詳細信息,請參見文檔的設計部分。

kafka作為一個消息系統(tǒng)

Kafka的流與傳統(tǒng)企業(yè)消息系統(tǒng)相比的概念如何?

傳統(tǒng)的消息有兩種模式:隊列發(fā)布訂閱。 在隊列模式中,消費者池從服務器讀取消息(每個消息只被其中一個讀?。? 發(fā)布訂閱模式:消息廣播給所有的消費者。這兩種模式都有優(yōu)缺點,隊列的優(yōu)點是允許多個消費者瓜分處理數(shù)據(jù),這樣可以擴展處理。但是,隊列不像多個訂閱者,一旦消息者進程讀取后故障了,那么消息就丟了。而發(fā)布和訂閱允許你廣播數(shù)據(jù)到多個消費者,由于每個訂閱者都訂閱了消息,所以沒辦法縮放處理。

kafka中消費者組有兩個概念:隊列:消費者組(consumer group)允許同名的消費者組成員瓜分處理。發(fā)布訂閱:允許你廣播消息給多個消費者組(不同名)。

kafka的每個topic都具有這兩種模式。

kafka有比傳統(tǒng)的消息系統(tǒng)更強的順序保證。

傳統(tǒng)的消息系統(tǒng)按順序保存數(shù)據(jù),如果多個消費者從隊列消費,則服務器按存儲的順序發(fā)送消息,但是,盡管服務器按順序發(fā)送,消息異步傳遞到消費者,因此消息可能亂序到達消費者。這意味著消息存在并行消費的情況,順序就無法保證。消息系統(tǒng)常常通過僅設1個消費者來解決這個問題,但是這意味著沒用到并行處理。

kafka做的更好。通過并行topic的parition —— kafka提供了順序保證和負載均衡。每個partition僅由同一個消費者組中的一個消費者消費到。并確保消費者是該partition的唯一消費者,并按順序消費數(shù)據(jù)。每個topic有多個分區(qū),則需要對多個消費者做負載均衡,但請注意,相同的消費者組中不能有比分區(qū)更多的消費者,否則多出的消費者一直處于空等待,不會收到消息。

kafka作為一個存儲系統(tǒng)

所有發(fā)布消息到消息隊列和消費分離的系統(tǒng),實際上都充當了一個存儲系統(tǒng)(發(fā)布的消息先存儲起來)。Kafka比別的系統(tǒng)的優(yōu)勢是它是一個非常高性能的存儲系統(tǒng)

寫入到kafka的數(shù)據(jù)將寫到磁盤并復制到集群中保證容錯性。并允許生產(chǎn)者等待消息應答,直到消息完全寫入。

kafka的磁盤結(jié)構 - 無論你服務器上有50KB或50TB,執(zhí)行是相同的。

client來控制讀取數(shù)據(jù)的位置。你還可以認為kafka是一種專用于高性能,低延遲,提交日志存儲,復制,和傳播特殊用途的分布式文件系統(tǒng)

kafka的流處理

僅僅讀,寫和存儲是不夠的,kafka的目標是實時的流處理。

在kafka中,流處理持續(xù)獲取輸入topic的數(shù)據(jù),進行處理加工,然后寫入輸出topic。例如,一個零售APP,接收銷售和出貨的輸入流,統(tǒng)計數(shù)量或調(diào)整價格后輸出。

可以直接使用producer和consumer API進行簡單的處理。對于復雜的轉(zhuǎn)換,Kafka提供了更強大的Streams API??蓸嫿?code>聚合計算或連接流到一起的復雜應用程序。

助于解決此類應用面臨的硬性問題:處理無序的數(shù)據(jù),代碼更改的再處理,執(zhí)行狀態(tài)計算等。

Sterams API在Kafka中的核心:使用producer和consumer API作為輸入,利用Kafka做狀態(tài)存儲,使用相同的組機制在stream處理器實例之間進行容錯保障。

拼在一起

消息傳遞,存儲和流處理的組合看似反常,但對于Kafka作為流式處理平臺的作用至關重要。

像HDFS這樣的分布式文件系統(tǒng)允許存儲靜態(tài)文件來進行批處理。這樣系統(tǒng)可以有效地存儲和處理來自過去的歷史數(shù)據(jù)。

傳統(tǒng)企業(yè)的消息系統(tǒng)允許在你訂閱之后處理未來的消息:在未來數(shù)據(jù)到達時處理它。

Kafka結(jié)合了這兩種能力,這種組合對于kafka作為流處理應用和流數(shù)據(jù)管道平臺是至關重要的。

批處理以及消息驅(qū)動應用程序的流處理的概念:通過組合存儲和低延遲訂閱,流處理應用可以用相同的方式對待過去和未來的數(shù)據(jù)。它是一個單一的應用程序,它可以處理歷史的存儲數(shù)據(jù),當它處理到最后一個消息時,它進入等待未來的數(shù)據(jù)到達,而不是結(jié)束。

同樣,對于流數(shù)據(jù)管道(pipeline),訂閱實時事件的組合使得可以將Kafka用于非常低延遲的管道;但是,可靠地存儲數(shù)據(jù)的能力使得它可以將其用于必須保證傳遞的關鍵數(shù)據(jù),或與僅定期加載數(shù)據(jù)或長時間維護的離線系統(tǒng)集成在一起。流處理可以在數(shù)據(jù)到達時轉(zhuǎn)換它。

感謝各位的閱讀,以上就是“kafka的基礎原理和作用”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對kafka的基礎原理和作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

當前標題:kafka的基礎原理和作用
當前鏈接:http://muchs.cn/article34/pgohpe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號動態(tài)網(wǎng)站、響應式網(wǎng)站、Google、網(wǎng)站改版、自適應網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)