熟悉Apache 大數據開發技術棧的朋友都知道 Kafka 在大數據開發中的作用,所以面試中會遇到相關問題。
這個問題問的非常好,所以有必要記錄一下。對從事大數據開發的工程師來說也可以借鑒。
Kafka通常用于兩大類應用:
· 構建實時流數據管道,在系統或應用程序之間可靠地獲取數據
· 構建轉換或響應數據流的實時流應用程序
下圖可以看到Kafka 可以用于應用程序與數據庫之間消息流傳遞的橋梁,可用于軟件服務系統,數據分析及監控系統。
Kafka消息隊列的應用
所以傳遞消息的可靠性是其非常關鍵的特性,同時也是軟件服務質量的保證。
什么時候會丟數據能?
Kafka流媒體平臺是發布和訂閱消息的構架,類似于消息隊列或企業消息傳遞系統。
由 Producer(生產),Broker(存儲)和(Consumer)消費三部分構成。
生產者與消費者
先看Producer 的特性怎么用會數據丟失呢?
1. 當屬性中的確認(ACK)不是all。
- acks = all -只有當所有消費者確認保存了消息時,才會返回ACK。--不會丟
- acks = 1 -當leader消費者保存消息就返回ACK – 接收的leader如果確認后還沒來得及備份就掛了丟數據
- acks = 0 -不等待任何確認 – 接收方有問題時候丟數據
2. 當send后producer程序掛了丟數據(如果沒用鉤子,flush 也沒來得及)
因為如下圖所示 producer 先把數據放buffer里面,而且是異步的。Buffer里面的數據是內存中數據程序退出就沒了。所以記得用鉤子
Producer 中的 Buffer
下面是一個JAVA 8+關機鉤子的例子:
鉤子例子
總結:
其實這個問題遇到過,但是面試時候只想到了checkpoint 沒有想到這里。
為什么呢?
只關注了自己最熟悉的方面來回答,并沒有從系統構架上去思考。
當我們把一個系統給它拆開分析的時候,就會有更多的思路,也就會有更全面的回答。
還有沒有其它情況會丟數據呢?待續。