目錄 1、kafka是什么一種高吞吐量的分布式、發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者規(guī)模的,網(wǎng)站中的所有動(dòng)作流數(shù)據(jù),具有高性能、持久化、多副本備份、橫向擴(kuò)展能力……
image.png
2、消息從生產(chǎn)到消費(fèi)2.1、發(fā)送數(shù)據(jù)永遠(yuǎn)找leader!消息寫入leader后,follower是主動(dòng)的去leader進(jìn)行同步的!producer采用push模式將數(shù)據(jù)發(fā)布到broker,每條消息追加到分區(qū)中,順序?qū)懭氪疟P,所以保證同一分區(qū)內(nèi)的數(shù)據(jù)是有序的!
image.png
發(fā)送數(shù)據(jù)可靠性保證:ACK機(jī)制! 0:代表producer往集群發(fā)送數(shù)據(jù)不需要等到集群的返回,不確保消息發(fā)送成功。安全性最低但是效率最高。 敲黑板:所以這里可能是會(huì)丟消息的喲! 0:發(fā)丟了,生產(chǎn)端不知道,就是丟了。 2.2、保存數(shù)據(jù)你以為是這樣的: image.png
其實(shí)是這樣的: image.png
操作系統(tǒng)本身有一層緩存,叫做 Page Cache,是在內(nèi)存里的緩存,我們也可以稱之為 OS Cache,意思就是操作系統(tǒng)自己管理的緩存。你在寫入磁盤文件的時(shí)候,可以直接寫入這個(gè) OS Cache 里,也就是僅僅寫入內(nèi)存中,接下來由操作系統(tǒng)自己決定什么時(shí)候把 OS Cache 里的數(shù)據(jù)真的刷入磁盤文件中。 Kafka提供了一個(gè)參數(shù)——producer.type來控制是不是主動(dòng)flush,如果Kafka寫入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);寫入mmap之后立即返回Producer不調(diào)用flush叫異步 (async)。 敲黑板:所以這里也可能是會(huì)丟消息的喲! 假如已經(jīng)寫在了OS cache中但是還沒來得及刷入磁盤,此時(shí)突然機(jī)器宕機(jī),或者broker重啟,那就丟了。 2.3、消費(fèi)數(shù)據(jù)消費(fèi)者通過pull模式主動(dòng)的去kafka集群拉取消息,與producer相同的是,消費(fèi)者在拉取消息的時(shí)候也是找leader去拉取。 多個(gè)消費(fèi)者可以組成一個(gè)消費(fèi)者組(consumer group),每個(gè)消費(fèi)者組都有一個(gè)組id!同一個(gè)消費(fèi)組者的消費(fèi)者可以消費(fèi)同一topic下不同分區(qū)的數(shù)據(jù),但是不會(huì)組內(nèi)多個(gè)消費(fèi)者消費(fèi)同一分區(qū)的數(shù)據(jù)。 image.png
在早期的版本中,消費(fèi)者將消費(fèi)到的offset維護(hù)zookeeper中,consumer每間隔一段時(shí)間上報(bào)一次,這里容易導(dǎo)致重復(fù)消費(fèi),且性能不好!在新的版本中消費(fèi)者消費(fèi)到的offset已經(jīng)直接維護(hù)在kafka集群的__consumer_offsets這個(gè)topic中! 消費(fèi)消息的時(shí)候可以大致分為兩個(gè)階段:1、標(biāo)示該消息已被消費(fèi)(commit記錄一下);2、處理消息。 敲黑板:所以這里也可能是會(huì)丟消息的喲! 先commit,但是在處理消息的異常了,此時(shí)這條消息就丟了。 3、消息可靠性保證
從 Producer 向 broker 發(fā)送消息時(shí),通過ACK機(jī)制保證不丟消息,但是不可靠,依賴kafka的參數(shù)配置:
在broker存儲(chǔ)消息時(shí),通過主動(dòng)flush來保證可靠性,但是如果沒設(shè)置強(qiáng)制flush,那就有可能丟了。 從 broker 到 Consumer 消費(fèi)消息時(shí),數(shù)據(jù)處理與 commit 的順序在很大程度上決定了消息從 broker 和 consumer 的可靠性:
|
|