KAFKA介绍(分布式架构)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
介紹
Kafka是一個(gè)分布式的、可分區(qū)的、可復(fù)制的消息系統(tǒng)。它提供了普通消息系統(tǒng)的功能,但具有自己獨(dú)特的設(shè)計(jì)。這個(gè)獨(dú)特的設(shè)計(jì)是什么樣的呢?
首先讓我們看幾個(gè)基本的消息系統(tǒng)術(shù)語(yǔ):
Kafka將消息以topic為單位進(jìn)行歸納。
將向Kafka topic發(fā)布消息的程序成為producers.
將預(yù)訂topics并消費(fèi)消息的程序成為consumer.
Kafka以集群的方式運(yùn)行,可以由一個(gè)或多個(gè)服務(wù)組成,每個(gè)服務(wù)叫做一個(gè)broker.
producers通過(guò)網(wǎng)絡(luò)將消息發(fā)送到Kafka集群,集群向消費(fèi)者提供消息,如下圖所示:
客戶端和服務(wù)端通過(guò)TCP協(xié)議通信。Kafka提供了Java客戶端,并且對(duì)多種語(yǔ)言都提供了支持。
Topics 和Logs
先來(lái)看一下Kafka提供的一個(gè)抽象概念:topic.
一個(gè)topic是對(duì)一組消息的歸納。對(duì)每個(gè)topic,Kafka 對(duì)它的日志進(jìn)行了分區(qū),如下圖所示:
每個(gè)分區(qū)都由一系列有序的、不變的消息組成,這些消息被連續(xù)的追加到分區(qū)中。分區(qū)中的每個(gè)消息都有一個(gè)連續(xù)的序列號(hào)叫做offset,用來(lái)在分區(qū)中唯一的標(biāo)識(shí)這個(gè)消息。
在一個(gè)可配置的時(shí)間段內(nèi),Kafka集群保留所有發(fā)布的消息,不管這些消息有沒(méi)有被消費(fèi)。比如,如果消息的保存策略被設(shè)置為2天,那么在一個(gè)消 息被發(fā)布的兩天時(shí)間內(nèi),它都是可以被消費(fèi)的。之后它將被丟棄以釋放空間。Kafka的性能是和數(shù)據(jù)量無(wú)關(guān)的常量級(jí)的,所以保留太多的數(shù)據(jù)并不是問(wèn)題。
實(shí)際上每個(gè)consumer唯一需要維護(hù)的數(shù)據(jù)是消息在日志中的位置,也就是offset.這個(gè)offset有consumer來(lái)維護(hù):一般情 況下隨著consumer不斷的讀取消息,這offset的值不斷增加,但其實(shí)consumer可以以任意的順序讀取消息,比如它可以將offset設(shè)置 成為一個(gè)舊的值來(lái)重讀之前的消息。
以上特點(diǎn)的結(jié)合,使Kafka consumers非常的輕量級(jí):它們可以在不對(duì)集群和其他consumer造成影響的情況下讀取消息。你可以使用命令行來(lái)"tail"消息而不會(huì)對(duì)其他正在消費(fèi)消息的consumer造成影響。
將日志分區(qū)可以達(dá)到以下目的:首先這使得每個(gè)日志的數(shù)量不會(huì)太大,可以在單個(gè)服務(wù)上保存。另外每個(gè)分區(qū)可以單獨(dú)發(fā)布和消費(fèi),為并發(fā)操作topic提供了一種可能。
分布式
每個(gè)分區(qū)在Kafka集群的若干服務(wù)中都有副本,這樣這些持有副本的服務(wù)可以共同處理數(shù)據(jù)和請(qǐng)求,副本數(shù)量是可以配置的。副本使Kafka具備了容錯(cuò)能力。
每個(gè)分區(qū)都由一個(gè)服務(wù)器作為“l(fā)eader”,零或若干服務(wù)器作為“followers”,leader負(fù)責(zé)處理消息的讀和 寫,followers則去復(fù)制leader.如果leader down了,followers中的一臺(tái)則會(huì)自動(dòng)成為leader。集群中的每個(gè)服務(wù)都會(huì)同時(shí)扮演兩個(gè)角色:作為它所持有的一部分分區(qū)的leader,同 時(shí)作為其他分區(qū)的followers,這樣集群就會(huì)據(jù)有較好的負(fù)載均衡。
Producers
Producer將消息發(fā)布到它指定的topic中,并負(fù)責(zé)決定發(fā)布到哪個(gè)分區(qū)。通常簡(jiǎn)單的由負(fù)載均衡機(jī)制隨機(jī)選擇分區(qū),但也可以通過(guò)特定的分區(qū)函數(shù)選擇分區(qū)。使用的更多的是第二種。
Consumers
發(fā)布消息通常有兩種模式:隊(duì)列模式和發(fā)布-訂閱模式。隊(duì)列模式中,consumers可以同時(shí)從服務(wù)端讀取消息,每個(gè)消息只被其中一個(gè)consumer讀到;發(fā)布-訂閱模式中消息被廣播到所有的consumer中。
Consumers可以加入一個(gè)consumer 組,共同競(jìng)爭(zhēng)一個(gè)topic,topic中的消息將被分發(fā)到組中的一個(gè)成員中。同一組中的consumer可以在不同的程序中,也可以在不同的機(jī)器上。如果所有的consumer都在一個(gè)組中,這就成為了傳統(tǒng)的隊(duì)列模式,在各consumer中實(shí)現(xiàn)負(fù)載均衡。
如果所有的consumer都不在不同的組中,這就成為了發(fā)布-訂閱模式,所有的消息都被分發(fā)到所有的consumer中。
更常見的是,每個(gè)topic都有若干數(shù)量的consumer組,每個(gè)組都是一個(gè)邏輯上的“訂閱者”,為了容錯(cuò)和更好的穩(wěn)定性,每個(gè)組由若干consumer組成。這其實(shí)就是一個(gè)發(fā)布-訂閱模式,只不過(guò)訂閱者是個(gè)組而不是單個(gè)consumer。
由兩個(gè)機(jī)器組成的集群擁有4個(gè)分區(qū) (P0-P3) 2個(gè)consumer組. A組有兩個(gè)consumerB組有4個(gè)
相比傳統(tǒng)的消息系統(tǒng),Kafka可以很好的保證有序性。
傳統(tǒng)的隊(duì)列在服務(wù)器上保存有序的消息,如果多個(gè)consumers同時(shí)從這個(gè)服務(wù)器消費(fèi)消息,服務(wù)器就會(huì)以消息存儲(chǔ)的順序向consumer分 發(fā)消息。雖然服務(wù)器按順序發(fā)布消息,但是消息是被異步的分發(fā)到各consumer上,所以當(dāng)消息到達(dá)時(shí)可能已經(jīng)失去了原來(lái)的順序,這意味著并發(fā)消費(fèi)將導(dǎo)致 順序錯(cuò)亂。為了避免故障,這樣的消息系統(tǒng)通常使用“專用consumer”的概念,其實(shí)就是只允許一個(gè)消費(fèi)者消費(fèi)消息,當(dāng)然這就意味著失去了并發(fā)性。
在這方面Kafka做的更好,通過(guò)分區(qū)的概念,Kafka可以在多個(gè)consumer組并發(fā)的情況下提供較好的有序性和負(fù)載均衡。將每個(gè)分區(qū)分 只分發(fā)給一個(gè)consumer組,這樣一個(gè)分區(qū)就只被這個(gè)組的一個(gè)consumer消費(fèi),就可以順序的消費(fèi)這個(gè)分區(qū)的消息。因?yàn)橛卸鄠€(gè)分區(qū),依然可以在多 個(gè)consumer組之間進(jìn)行負(fù)載均衡。注意consumer組的數(shù)量不能多于分區(qū)的數(shù)量,也就是有多少分區(qū)就允許多少并發(fā)消費(fèi)。
Kafka只能保證一個(gè)分區(qū)之內(nèi)消息的有序性,在不同的分區(qū)之間是不可以的,這已經(jīng)可以滿足大部分應(yīng)用的需求。如果需要topic中所有消息的有序性,那就只能讓這個(gè)topic只有一個(gè)分區(qū),當(dāng)然也就只有一個(gè)consumer組消費(fèi)它。
歡迎大家一起學(xué)習(xí)研究相關(guān)技術(shù)愿意了解框架技術(shù)或者源碼的朋友直接求求交流分享技術(shù):2042849237
轉(zhuǎn)載于:https://my.oschina.net/u/3873725/blog/1935676
總結(jié)
以上是生活随笔為你收集整理的KAFKA介绍(分布式架构)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: tablayout支持改变选中文字大小,
- 下一篇: 如何让语音芯片与功放芯片之间更好的配合,