來源:北大青鳥總部 2023年05月18日 13:38
今天我們要給大家補(bǔ)的知識(shí)點(diǎn)便是分布式消息系統(tǒng)Kafka。
在互聯(lián)網(wǎng)海量數(shù)據(jù)、高并發(fā)、高可用、低延遲的要求下,使用消息系統(tǒng)來進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā)、系統(tǒng)之間的解藕是必不可少的,學(xué)習(xí)Kafka就先來看看Kafka的典型使用場(chǎng)景。
場(chǎng)景1之消息系統(tǒng),即將生產(chǎn)者應(yīng)用和消費(fèi)者應(yīng)用解藕,生產(chǎn)者的消息通過Kafka發(fā)送,消費(fèi)者訂閱Kafka的消息。
場(chǎng)景2之日志收集,即通過Kafka收集各種服務(wù)的日志,再以統(tǒng)一接口服務(wù)的方式開放給各個(gè)consumer。
場(chǎng)景3之用戶活動(dòng)跟蹤,即通過Kafka記錄web用戶或app用戶的活動(dòng),消費(fèi)者訂閱該數(shù)據(jù)進(jìn)行實(shí)時(shí)的分析。
場(chǎng)景4之運(yùn)營(yíng)指標(biāo),即通過Kafka記錄運(yùn)營(yíng)指標(biāo)、監(jiān)控?cái)?shù)據(jù),消費(fèi)者再訂閱這些數(shù)據(jù)進(jìn)行報(bào)警。
場(chǎng)景5之流式處理,即對(duì)接sparkstreaming、storm來實(shí)時(shí)處理數(shù)據(jù)。
接著我們?cè)倮^續(xù)介紹Kafka的基本名詞概念,在Kafka中有Broker、Topic、Partition、Segment、Producer、Consumer五個(gè)基本概念。所謂Broker就是Kafka節(jié)點(diǎn),一個(gè)服務(wù)器實(shí)例,存儲(chǔ)消息隊(duì)列數(shù)據(jù);所謂Topic就是消息,比如購(gòu)買商品后會(huì)有商品購(gòu)買成功的推送,這就是一類信息;所謂partition就是分組,一個(gè)topic可以分為多個(gè)partition,比如購(gòu)買商品后可按用戶地域進(jìn)行消息的推送,北京地域是一個(gè)partition,上海地域是一個(gè)partition;所謂segment就是分段,將partition分為多段,存儲(chǔ)消息;所謂producer就是生產(chǎn)者,負(fù)責(zé)生產(chǎn)消息;所謂consumer就是消費(fèi)者,負(fù)責(zé)消費(fèi)消息。Kafka工作的流程就是producer發(fā)布消息,系統(tǒng)為每類數(shù)據(jù)創(chuàng)建一個(gè)topic,在broker集群持久化和備份具體的Kafka消息,consumer訂閱topic進(jìn)行消費(fèi)消息。
作為一個(gè)開源軟件,Kafka最重要的能力便是提供API。在Kafka中有四大API:即生產(chǎn)者API、消費(fèi)者API、流API、連接器API。
通過生產(chǎn)者API,消息的生產(chǎn)者便可以直接與集群中的Kafka服務(wù)器連接,發(fā)送流數(shù)據(jù)到一個(gè)或多個(gè)Kafka的topic中。
通過消費(fèi)者API,消息的消費(fèi)者便可以直接與集群中的Kafka服務(wù)器連接,消費(fèi)Kafka中topic的流消息。
通過流API,可順利的從topic中消費(fèi)輸入流,生產(chǎn)輸出流,在流處理中,通過Kafkastreams api也將數(shù)據(jù)提供到大數(shù)據(jù)平臺(tái)、Cassandra、spark中進(jìn)行數(shù)據(jù)分析。
通過連接器ConnectorAPI,開發(fā)者可以構(gòu)建、運(yùn)行可重復(fù)使用的生產(chǎn)者與消費(fèi)者。
作為一個(gè)分布式消息系統(tǒng),Kafka是如何實(shí)現(xiàn)分布式的呢?Kafka需要與zookeeper一起使用才能對(duì)外提供分布式消息系統(tǒng)能力。我們假設(shè)有這樣的一個(gè)場(chǎng)景,在Kafka集群中,有一個(gè)很大的topic要處理。我們先把這個(gè)topic放在代理服務(wù)器Broker1、broker2、broker3上,在broker1/2/3上分別包含分區(qū)partition1/2/3。當(dāng)一個(gè)broker啟動(dòng)時(shí),首先會(huì)向zookeeper注冊(cè)自己的broker、topic、partition信息等meta元信息。當(dāng)消費(fèi)者啟動(dòng)時(shí),也會(huì)向zookeeper節(jié)點(diǎn)注冊(cè)自己的信息,監(jiān)聽生產(chǎn)者的變化。那么數(shù)據(jù)是如何分布各個(gè)節(jié)點(diǎn)呢?事實(shí)上每個(gè)節(jié)點(diǎn)的數(shù)據(jù)都會(huì)在整個(gè)集群進(jìn)行復(fù)制,比如在broker1中每個(gè)分區(qū)中的數(shù)據(jù)都會(huì)復(fù)制一份到該集群中的Broker2、broker3,由broker1作為主節(jié)點(diǎn)對(duì)生產(chǎn)者和消費(fèi)者提供數(shù)據(jù),當(dāng)broker1節(jié)點(diǎn)掛掉時(shí),通過使用zookeeper工具在剩下的broker2、broker3中選舉出新的主節(jié)點(diǎn)對(duì)外提供服務(wù)。因此在Kafka集群中所有的數(shù)據(jù)在每個(gè)broker節(jié)點(diǎn)都有,無論何時(shí)都保障了服務(wù)的高可用。
最后我們看看在Kafka中如何保障數(shù)據(jù)的可靠性呢?
第一是消息順序讀寫,如果生產(chǎn)者producer先寫入了消息1,再寫入消息2,那么消費(fèi)者consumer則會(huì)先消費(fèi)1再消費(fèi)2;
第二是消息寫入到所有的Kafka節(jié)點(diǎn)后才會(huì)被認(rèn)為該消息已提交;
第三是一旦消息已提交,只要有一個(gè)Kafka節(jié)點(diǎn)存活,數(shù)據(jù)就不會(huì)丟失;
第四就是消費(fèi)者consumer只能讀取已提交的消息。通過這些機(jī)制,足以保障Kafka系統(tǒng)數(shù)據(jù)的可靠性了。
在本文,我們介紹了從使用場(chǎng)景、基本概念、重要能力、分布式保障、可靠性保障五個(gè)方面介紹了Kafka,如果在面試中面試官有問到Kafka或消息隊(duì)列相關(guān)的知識(shí)點(diǎn),再也不怕被問住了~