熟悉Apache 大數(shù)據(jù)開發(fā)技術(shù)棧的朋友都知道 Kafka 在大數(shù)據(jù)開發(fā)中的作用,所以面試中會遇到相關(guān)問題。
這個問題問的非常好,所以有必要記錄一下。對從事大數(shù)據(jù)開發(fā)的工程師來說也可以借鑒。
Kafka通常用于兩大類應(yīng)用:
· 構(gòu)建實時流數(shù)據(jù)管道,在系統(tǒng)或應(yīng)用程序之間可靠地獲取數(shù)據(jù)
· 構(gòu)建轉(zhuǎn)換或響應(yīng)數(shù)據(jù)流的實時流應(yīng)用程序
下圖可以看到Kafka 可以用于應(yīng)用程序與數(shù)據(jù)庫之間消息流傳遞的橋梁,可用于軟件服務(wù)系統(tǒng),數(shù)據(jù)分析及監(jiān)控系統(tǒng)。

Kafka消息隊列的應(yīng)用
所以傳遞消息的可靠性是其非常關(guān)鍵的特性,同時也是軟件服務(wù)質(zhì)量的保證。
什么時候會丟數(shù)據(jù)能?
Kafka流媒體平臺是發(fā)布和訂閱消息的構(gòu)架,類似于消息隊列或企業(yè)消息傳遞系統(tǒng)。
由 Producer(生產(chǎn)),Broker(存儲)和(Consumer)消費(fèi)三部分構(gòu)成。

生產(chǎn)者與消費(fèi)者
先看Producer 的特性怎么用會數(shù)據(jù)丟失呢?
1. 當(dāng)屬性中的確認(rèn)(ACK)不是all。
- acks = all -只有當(dāng)所有消費(fèi)者確認(rèn)保存了消息時,才會返回ACK。--不會丟
- acks = 1 -當(dāng)leader消費(fèi)者保存消息就返回ACK – 接收的leader如果確認(rèn)后還沒來得及備份就掛了丟數(shù)據(jù)
- acks = 0 -不等待任何確認(rèn) – 接收方有問題時候丟數(shù)據(jù)
2. 當(dāng)send后producer程序掛了丟數(shù)據(jù)(如果沒用鉤子,flush 也沒來得及)
因為如下圖所示 producer 先把數(shù)據(jù)放buffer里面,而且是異步的。Buffer里面的數(shù)據(jù)是內(nèi)存中數(shù)據(jù)程序退出就沒了。所以記得用鉤子

Producer 中的 Buffer
下面是一個JAVA 8+關(guān)機(jī)鉤子的例子:

鉤子例子
總結(jié):
其實這個問題遇到過,但是面試時候只想到了checkpoint 沒有想到這里。
為什么呢?
只關(guān)注了自己最熟悉的方面來回答,并沒有從系統(tǒng)構(gòu)架上去思考。
當(dāng)我們把一個系統(tǒng)給它拆開分析的時候,就會有更多的思路,也就會有更全面的回答。
還有沒有其它情況會丟數(shù)據(jù)呢?待續(xù)。