83、介紹下Kafka,Kafka的作用?Kafka的組件?適用場景?
kafka是一個高吞吐量、可擴展的分布式消息傳遞系統,在處理實時流式數據,并能夠保證持久性和容錯性
可用于數據管道、流分析和數據繼承和關鍵任務應用(發布/訂閱模式)
發布/訂閱模式:
可以有多個topic主題、消費者消費數據之后,不刪除數據、每個消費者相互獨立,都可以消費數據
84、Kafka作為消息隊列,它可解決什么樣的問題?
異步:允許用戶把一個消息放入隊列,但并不立即處理他們,需要的時候再去處理
消峰:有助于控制和優化數據流經過系統的速度,解決生產消息和消費消息的處理速度不一致的情況
解耦:允許獨立擴展或者修改兩邊的處理過程,只要確保他們遵守同樣的接口約束
85、說下Kafka架構
生產者:消息的生產者,就是向kafka broker發消息的客戶端
消費者:獲取消息的客戶端
消費組:有多個消費者組成,消費者組內每個消費者負責消費不同分區的數據,一個分區只能由一個組內的消費者消費;消費者組之間互補影響;所以消費者組邏輯上是一個訂閱者
broker:一臺kafka服務器就是一個broker,一個broker可以容納多個topic
topic:一個隊列,生產者和消費者面向的都是一個topic
partition:一個非常大的toipc可以分布到多個broker,一個topic可以分為多個partition
replica:
leader:
follower:
86、Kafka的工作原理和它與傳統消息隊列服務的不同之處?與RabbitMQ相比?
特點:
發布訂閱模型;分區和復制;高吞吐量;實時數據流支持:傳統消息隊列只支持鵆并按需查看歷史數據,而kafka還支持傳輸實時流數據
與傳統消息隊列相比:kafka優化了磁盤使用、利用操作系統緩存進行高速讀寫、并提高高效的分區和復制機制
RabbitMQ:在大規模實時性要求教導的場景下,使用kafka合適;在簡單的消息傳遞與排隊需求中,選擇常見的消息隊列較為合適、
補充:兩種消息隊列模式
點對點模式:點對點通常是基于拉取或者輪詢的消息傳送模型,發送到隊列的消息被一個且只有一個消費者進行消費,生產者把消息放入消息隊列后,由消費者主動拉取消息進行消費;優點是消費者拉取消息的頻率可以由自己控制
發布訂閱模式:生產者把消息放入消息隊列以后,隊列會把消息推送給該類的消費者
87、kafka的工作流程
創建一個kafka的生產者將源數據推送到kafka的topic中,然后使用消費者從topic訂閱消息,并傳遞給處理引擎或者存儲系統
在生產者流程中有兩個關鍵參數(batch.size和linger.ms):只有數據累計達到batch.size后,sender才會發送數據,默認為16k;如果數據遲遲未達到batch.size,sender設置的linger.ms設置的時間達到以后就會發送數據,默認為0ms,表示沒有延遲。
88、kakfa分區容錯性
副本機制:kafka允許一個topic創建多個副本,并將這些副本分布在不同的broker上
數據復制:kafka使用異步復制機制來保證數據的可靠性,當消息被寫入到leader副本時候,kafka會將其異步復制到follower副本中
ISR機制:用來保證副本之間的一致性,如果某個副本無法及時復制消息或者落后于其他副本太多,他將被從SIR集合中移除,直到追趕上其他副本的進度為止
故障轉移:當某個broker宕機或者分區的領導副本不可用時候,kafka會自動進行故障轉移,它會從ISR集合中選擇一個新副本作為領導副本
89、kafka的分區策略
如上是kafka的構造方法:
1、如果指定了partition的情況下,直接將指明的值作為partition值
2、如果沒有指明partition值但有key的情況之下,將key的hash值與topic的partition數進行取余得到partition的值,并將對應的value寫入到對應的分區中
3、既沒有partition值又沒有key值的情況下,kafka采用粘性分區器(sticky partition),會隨機選擇一個分區,并盡可能一直使用或者分區,直到該分區的batch已滿或者已完成,kafka再隨機一個分區進行使用。
90、Kafka如何盡可能保證數據可靠性?
1、保證分區消息的順序———分區有序
2、只有當消息被寫入分區的所有同步副本時候,它才被認為是已經提交的(ACK應答)
ACK是指:ackowledgement,用于控制生產者發送消息時候的可靠性和性能,
ACK=0:生產者對象將數據通過網絡客戶端將數據發送到網絡數據流中的時候,kafka就對當前的數據請求進行了響應,確認應答,只是能保證數據已經通過網絡發送給kafka,并不能保證kafka一定能接收到,無法保證數據的可靠性,但通信效率高
ACK=1:生產者等待leader副本成功寫入消息到日志文件后就認為發送成功,適用于對可靠性較高的場景,這種應答方式,數據已經存儲到分區的leader副本中,數據相對安全,但數據并沒有及時備份到follower副本,一旦broker崩潰,數據也會丟失
ACK=all或者-1(默認):生產者等待ISR中所有副本成功寫入消息后,就認為發送成功,適用于對數據不可丟失的高可靠性要求場景(一般是金融級別的才會使用這種配置)
3、只要還有一個副本是活躍的,那么已經提交的消息就不會丟失
4、消費者只能讀取已經提交的消息
5、kafka的復制機制和分區的多副本架構是kafka可靠性保證的核心(topic被分為多個分區,分區是基本的數據塊,分區存儲在單個磁盤上,kafka可以保證分區里的事件是有序的,分區可以有多個副本)
91、kafka的同步與異步發送
同步模式:逐條發送,用戶線程選擇同步,效果是逐條發送,因為請求隊列InFlightRequest中永遠最多有一條數據,第一條響應到達以后,才會請求第二條
異步模式:如果設置成異步模式。可以運行生產者以batch的形式push數據,這樣會極大的提高broker的性能,會增加丟失數據的風險
如果kafka通過主線程代碼將一條數據放入到緩沖區中后,無需等待數據的后續發送過程,就直接發送下一條數據的場合,就是異步發送
如果Kafka通過主線程代碼將一條數據放入到緩沖區后,需等待數據的后續發送操作的應答狀態,才能發送一下條數據的場合,我們就稱之為同步發送。所以這里的所謂同步,就是生產數據的線程需要等待發送線程的應答(響應)結果。
92、kafka數據丟失和數據重復原因和解決辦法
數據丟失原因:不等待broker的ack,broker接收到磁盤就已經返回了,當broker故障時候會丟失數據
數據重復原因:當ack設置為1的時候,假如因為網絡原因,kafka沒有將應答消息發送給生產者,一旦超時時間閾值,就認為kafka數據丟失,此時生產者會嘗試對超時的請求數據進行重試,此時kafka中存在的數據是重復的
補充:數據冪等性
生產者同樣的一條數據,無論向kafka發送多少次,kafka只會存儲一條數據,
冪等性只能保證單分區消息有序不重復,多分區不能保證冪等性
數據傳輸語義:
93、生產者消費者模式與發布訂閱模式有何異同?
生產者消費者模式,指的是由生產者將數據源源不斷推送到消息中心,有不同的消費者從消息中心取出數據做自己的處理,在同一類別下,所有消費者拿到的都是同樣的數據
發布訂閱模式:本質上也是一種消費者模式,由訂閱者首先向消息中心指定自己對哪些數據感興趣,發布者推送的數據經過消息中心后,每個訂閱者拿到的僅僅是自己感興趣的數據
生產者消費者是所有消費者搶占消息,訂閱發布是所有訂閱者共享信息;
主動權不同,生產消費者主動權在消費者,訂閱發布主動權在發布者,
94、kafka如何保證全局有序
kafka通過分區和分區內的順序保證全局有序,將數據分為多個topic,每個topic可以有多個分區,每個分區都有唯一的標識,并且在集群中的多個節點上進行復制以提高高可用性
每個分區內,kafka使用offset來標識消息的順序,生產者將消息切入待定的分區時,kafka會為每個消息分配一個遞增的偏移量,消費者通過指定分區和偏移量來讀取消息,保證消費者按照指定順序處理消息
如果某一個topic只有一個分區,那么該主題的消息順序是全局有序的
如果一個topic有多個分區,kafka可以根據消息的key來選擇將消息寫入哪個分區,具有相同鍵的消息將被寫入同一個分區,并且同一個分區內的消息順序是有序的
95、Kafka為什么同一個消費者組的消費者不能消費相同的分區?
kafka中同一個消費者組的消費者組不能消費相同的分區是因為kafka中采用分區分配策略,確保每個分區被消費者組的的一個消費者消費,主要是為了確保消息的順序性和負載均衡,使得每個消費者都能夠處理大致相同的數量的消息
96、Kafka讀取消息是推還是拉的模式?有什么好?
kafka的消息讀取模式是pull拉模式,消費者主動拉取kafka服務器的消息
好處:
1、消費者可以根據自身的處理能力和需求決定拉取消息的速率
2、節約資源:可以避免服務器主動推送大量消息給消費者,減少網絡帶寬的和服務資源的消耗
3、容錯性:在拉取過程中出現錯誤,可以重新拉取相同的消息進行重試
4、消息積壓控制:消費者可以根據自身的處理能力調整拉取消息的速率
如果是push模式,多個分區的數據同時推送給消費者進行處理,明顯一個消費者的消費能力是有限的,消費者無法快速處理數據,就會導致數據的積壓,導致網絡、存儲的壓力,影響效率
補充:消費者組模式
如果topic的分區的數據過多,消費時間很長,至此對kafka1的壓力就很大;
在kafka中,每個消費者都對應一個消費者組,如果kafka想要消費消息,那么需要指定消費那個topic的消息以及自己的消費組id(groupId)
在消費者組中,多個實例共同訂閱若干個topic,實現共同消費,同一個組下的每個實例都配置有相同的ID,被分配不同的訂閱分區,當某個實例掛掉的時候,其他實例會自動地承擔起它負責消費的分區
97、kafka高吞吐的原理
1、順序讀寫磁盤,kafka消息是不斷追加到文件中的,使得kafka可以充分利用磁盤的互相內需讀寫性能,不需要次哦按磁頭的尋道時間,快速讀寫
2、kafka中的topic被分為了多個partition,每個partition又分為多個segment,一個隊列的消息實際上是保存在多個片段文件中通過分段的反射光hi,每次文件操作都是對一個小文件進行操作,增加了并行處理的能力
3、kafka的瓶頸不是cpu或者磁盤,而是網絡帶寬
98、說下Kafka中的Partition?
kafka的partirion過程是將topic劃分為多個獨立的數據片段的過程,每個parririon是一個有序的不可變的消息隊列,消息按照生產者的發送順序一次追加到partition中,每個partition在物理上對應一個獨立的日志文件,被分成多個segment
Partition的作用在于:
實現消息的水平擴展:Kafka可以在多個Broker上并行處理不同Partition的消息,提高了整個系統的吞吐量。
實現數據的持久化:每個Partition都會被復制到多個Broker上,確保數據的可靠性和冗余。
實現消息的順序性:在同一個Partition中,消息的順序是有序的,保證了消息的有序性處理。
每個Partition都有一個唯一的標識符(Partition ID),并且可以配置多個副本(Replica),其中一個為Leader副本,其它副本為Follower副本。Leader副本負責處理來自Producer和Consumer的請求,Follower副本用于備份和故障轉移。
在生產者發送消息時,可以選擇指定消息要發送到的Partition,如果沒有指定,Kafka會根據某種策略(如Hash值)將消息平均分配到各個Partition中。而在消費者消費消息時,可以訂閱一個或多個Partition,每個消費者只會消費其中一個Partition上的消息。
99、如何使用kafka實現實時數據流處理?
需要創建一個kafka的producer將元數據推送到kafka potic中,再使用kafka的consumer從topic中訂閱消息,并將其傳遞給流處理引擎spark或者flink,對接受到的消息進行實時計算和轉換,將結果寫回固定的外部存儲
100、flink的checkpoint和kafka的offset關聯是什么
flink的checkpoint用于記錄flink的應用程序的狀態,而kafka offset用于記錄消費者的topic的位置,兩者相互結合,以確保在故障恢復后不會重復處理kafka中的消息
補充:kafka中的數據模型
顧名思義就是kafka的架構;
補充:kafka為什么可以實現高效傳輸數據
1、利用Partition實現并行處理
一個topic包好多個partition,不同的partition位于不同的節點上,從而可以實現磁盤間的并行處理,充分發揮多磁盤的優勢。
2、順序寫磁盤(提供預讀和寫技術,磁盤的順序寫大多數情況下比隨機寫內存還要快)
影響磁盤的關鍵因素是磁盤的完成一個IO請求所花費的時間,它由尋道時間、旋轉時間和數據傳輸時間三部分構成。kafka中都通過追加的方式盡可能的將隨機IO轉換為順序IO,以此來降低尋址和旋轉延時
3、充分利用頁緩存Page Cache
引入cache層是為了提高linux操作系統對磁盤訪問的性能,cache層在內存中緩存了磁盤上的部分數據,免除了對底層磁盤的操作,提高了性能(liunx的實現中,文件cache層分為兩個層面,一個page cache,另一個是buffer cache,每個page chche有多個buffer chche,Page Cache 主要用來作為文件系統上的文件數據的緩存來用,尤其是針對當進程對文件有 read/write 操作的時候。Buffer Cache 則主要是設計用來在系統對塊設備進行讀寫的時候,對塊進行數據緩存的系統來使用。)
broker收到數據后,寫磁盤時只是將數據寫入page chche中,并不能保證數據一定會完全寫入磁盤,可能會造成頁緩存中的數據為寫入磁盤從而造成數據丟失
4、零拷貝(減少拷貝次數)
零拷貝是一種為了解決數據從內核緩存到用戶緩存的CPU拷貝產生的性能消耗的技術。
kafka中存在大量的網絡數據持久化到磁盤和磁盤文件需要通過網絡發送的過程,影響kafka的整體吞吐量
DMA:直接存儲器,是一個無需CPU參與,讓外設和系統內存之間進行雙向數據傳輸的硬件機制,可以使系統CPU從實際的IO數據傳輸過程中脫離出來,提高系統的吞吐率
當數據從磁盤經過DMA到內核緩存后,為了減少CPU的拷貝性能損耗,操作系統會將該內核緩存與用戶層,減少以此CPU拷貝的過程,
網絡數據持久化到磁盤中:
補充:kafka中的offset
在kafka中,每個topic分區下的每一條消息都被賦予了一個唯一的ID數值,用于標識它在分區中的位置,這個ID數值,就被稱為唯一,也叫做偏移量,一旦消費被寫入分區日志中,它的位移將不能被修改
補充:削峰、異步、解耦
削峰:就是緩沖瞬時的突發流量,使其平滑,對于上游發送能力很強的系統,若沒有消息中間件的保護,脆弱的下游系統可能會被直接壓垮導致雪崩
異步:不用同步等待下游將數據處理完,將喜喜發送到消息隊列中即可返回,不阻礙主流程
解耦: