https://blog.csdn.net/qq_28900249/article/details/90346599
1、為什么要使用 kafka,為什么要使用消息隊列
緩沖和削峰 解耦和擴展性 冗余 健壯性 異步通信
2、Kafka的acks參數對消息持久化的影響
往kafka寫數據的時候,就可以來設置這個acks參數。然后這個參數實際上有三種常見的值可以設置,分別是:0、1 和 all(等價於-1)。
API對應ProducerConfig.ACKS_CONFIG
第一種選擇是把acks參數設置為0,意思就是我的KafkaProducer在客戶端,只要把消息發送出去,不管那條數據有沒有在哪怕Partition Leader上落到磁盤,我就不管他了,直接就認為這個消息發送成功了。
如果你采用這種設置的話,那么你必須注意的一點是,可能你發送出去的消息還在半路。結果呢,Partition Leader所在Broker就直接掛了,然后結果你的客戶端還認為消息發送成功了,此時就會導致這條消息就丟失了。
第二種選擇是設置 acks = 1,意思就是說只要Partition Leader接收到消息而且寫入本地磁盤了,就認為成功了,不管他其他的Follower有沒有同步過去這條消息了。
這種設置其實是kafka默認的設置,大家請注意,划重點!這是默認的設置
也就是說,默認情況下,你要是不管acks這個參數,只要Partition Leader寫成功就算成功。
但是這里有一個問題,萬一Partition Leader剛剛接收到消息,Follower還沒來得及同步過去,結果Leader所在的broker宕機了,此時也會導致這條消息丟失,因為人家客戶端已經認為發送成功了。
最后一種情況,就是設置acks=all(或者-1),這個意思就是說,Partition Leader接收到消息之后,還必須要求ISR列表里跟Leader保持同步的那些Follower都要把消息同步過去,才能認為這條消息是寫入成功了。
如果說Partition Leader剛接收到了消息,但是結果Follower沒有收到消息,此時Leader宕機了,那么客戶端會感知到這個消息沒發送成功,他會重試再次發送消息過去。
此時可能Partition 2的Follower變成Leader了,此時ISR列表里只有最新的這個Follower轉變成的Leader了,那么只要這個新的Leader接收消息就算成功了。
3、kafka冪等性
解決發送消息重復的問題
4、kafka的分區與消費者關系
分區(partition)
kafka中的topic可以細分為不同的partition,一個topic可以將消息存放在不同的partion中。
leader和follower
每個partition可以設置一個leader和多個follower。kafka的消息沒有設置讀寫分離,每個消息發送時,都是發送至對應的partition的leader-partition,follower-partition主要是為了備份數據而存在,當leader-partition出現故障時,數據已經完全同步的follower-partition也會切換成leader-partition。
AR和ISR
AR:分區中所有的副本統稱為AR。
ISR:所有與leader節點保持同步的副本(包括leader節點)組成的節點,生產者首先將消息發送給leader副本,然后follower從leader中同步消息。
ISR是AR的子集。
數據的存儲
在partion中,一個topic中的數據存放在不同的partion中,一個分區的內容會存儲成一個log文件,為了防止log過大,引入了日志分段,根據一定規則將log切分為多個logSegment,相當於一個巨型文件被切分成了很多不同的文件。log和logSegment關系如下:
Log在物理上只以文件夾的形式存儲,日志文件在磁盤的存儲如下:
消費者(consumer)
分組(group)
消費者從partion中消費數據,consumer有group的概念,每個group可以消費完整的一份topic中的數據。
消費者分區分配
RangeAssignor 分配策略(kafka默認的分區策略)
kafka中,consumer消費數據時,consumer消費partition中的數據和consumer與partition的相對數量有關。
1、partition大於consumer
當partition大於consumer時,一個consumer可能同時消費多個partition中的數據
2、partition小於consumer
當partition小於consumer時,每個consumer會去消費一個partition中的數據。多出來的consumer則是處於空閑狀態
3、partition等於consumer
當partition的數量等於consumer時,每個consumer消費一個partition中的數據。
除了這種分區分配策略之外,還有RoundRobinAssignor以及StickyAssignor分區分配策略,當然,也可以自定義分區分配策略。