面試:Kafka相關問題

文章目錄

      • 簡單介紹kafka
      • kafka應用場景
      • 為什么需要zookeeper
      • Zookeeper 對于 Kafka 的作用是什么?
      • kafka高效的原因
      • kafka的特點
      • kafka的核心組成
      • Kafka中的Topic和Partition有什么關系?
      • Kafka的消費消息是如何傳遞的?
      • Kafka 的多副本機制了解嗎?
      • Kafka 的多分區(Partition)以及多副本(Replica)機制有什么好處呢?
      • Kafka 如何保證消息的消費順序?
      • Kafka 如何保證消息不丟失?
      • Kafka如何保證消息可靠?
      • Kafka 判斷一個節點是否還活著有那兩個條件?
      • producer 是否直接將數據發送到 broker 的 leader(主節點)?
      • Kafka consumer 是否可以消費指定分區消息嗎?
      • Kafka 高效文件存儲設計特點是什么?
      • partition 的數據如何保存到硬盤?
      • kafka 生產數據時數據的分組策略是怎樣的?
      • consumer 是推還是拉?
      • kafka 維護消費狀態跟蹤的方法有什么?
      • 是什么確保了 Kafka 中服務器的負載平衡?
      • 消費者 API 的作用是什么?
      • 流 API 的作用是什么?
      • Kafka 系統工具有哪些類型?
      • Kafka 的流處理是什么意思?
      • Kafka 集群中保留期的目的是什么?
      • Kafka與RabbitMQ相比有什么優勢?
      • 如何確保Kafka集群的高可用?
      • Kafka中的消費者偏移量是如何管理的?
      • Kafka中的消息如何分配給不同的消費者?
      • 什么是“零拷貝”?有什么作用?
      • Kafka中的消息是如何存儲的?

簡單介紹kafka

kafka是一款分布式的基于發布/訂閱模式的消息隊列,是目前比較主流的消息中間件,Kafka對消息保存時根據Topic(主題)進行歸類,發送消息者稱為Producer,消息接受者稱為Consumer,此外kafka集群有多個kafka實例組成,每個實例(server)稱為broker。無論是kafka集群,還是consumer都依賴于zookeeper集群保存一些meta信息,來保證系統可用性,所以安裝kafka需要先間搭建zookeeper集群。
kafka是基于磁盤操作的,不是基于內存操作的,為了提高數據傳輸性能,kafka使用到了零拷貝技術(sendfile技術);
kafka以高性能高吞吐量聞名,支撐其高性能的幾個特性是:零拷貝技術、順序寫磁盤、消息分區。

kafka應用場景

  1. 日志聚合:Kafka 通常用于收集和聚合分布式系統中產生的日志數據,以便后續的監控、分析和故障排除。
  2. 數據流處理:Kafka 可以作為數據流處理平臺的基礎,用于處理實時數據流,例如事件處理、實時分析和機器學習模型的訓練。
  3. 數據倉庫集成:Kafka 可以將數據傳輸到數據倉庫,如Hadoop或Elasticsearch,以進行高級分析和報告。
  4. 應用程序集成:許多應用程序可以使用 Kafka 作為消息中間件來實現異步通信,包括微服務架構、批處理作業等。
  5. 流媒體處理:Kafka 可以用于流媒體處理,例如實時監控、事件驅動的應用程序等

為什么需要zookeeper

Kafka集群中有一個broker會被選舉為Controller,負責管理集群broker的上下線,所有topic的分區副本分配和leader選舉等工作。Controller的管理工作都是依賴于Zookeeper的。

  • Broker 注冊:在 Zookeeper 上會有一個專?用來進行 Broker 服務器列表記錄的節點。每個 Broker 在啟動時,都會到 Zookeeper 上進行注冊,即到/brokers/ids 下創建屬于自己的節點。每個 Broker 就會將自己的IP 地址和端口等信息記錄到該節點中去
  • Topic 注冊:在 Kafka 中,同一個 Topic 的消息會被分成多個分區并將其分布在多個 Broker 上,這些分區信息及與 Broker 的對應關系也都是由 Zookeeper 在維護。比如我創建了一個名字為 my-topic 的主題并且它有兩個分區,對應到 zookeeper 中會創建這些文件夾:/brokers/topics/my-
    topic/Partitions/0、/brokers/topics/my - topic/Partitions/1
  • 負載均衡:上面也說過了 Kafka 通過給特定 Topic 指定多個 Partition,而各個 Partition 可以分布在不同的Broker 上,這樣便能提供比較好的并發能力。對于同一個 Topic 的不同 Partition,Kafka 會盡力將這些Partition 分布到不同的 Broker 服務器上。當生產者產生消息后也會盡量投遞到不同 Broker 的 Partition 里面。當 Consumer 消費的時候,Zookeeper 可以根據當前的 Partition 數量以及 Consumer 數量來實現動態負載均衡。

Zookeeper 對于 Kafka 的作用是什么?

Zookeeper 是一個開放源碼的、高性能的協調服務,它用于 Kafka 的分布式應用。
Zookeeper 主要用于在集群中不同節點之間進行通信。
在 Kafka 中,它被用于提交偏移量,因此如果節點在任何情況下都失敗了,它都可以從之前提交的偏移量中獲取。
除此之外,它還執行其他活動,如: leader 檢測、分布式同步、配置管理、識別新節點何時離開或連接、集群、節點實時狀態等等。

kafka高效的原因

順序寫磁盤:Kafka的producer生產數據,要寫入到log文件中,寫的過程是一直追加到文件末端,為順序寫。官網有數據表明,同樣的磁盤,順序寫能到600M/s,而隨機寫只有100K/s。這與磁盤的機械機構有關,順序寫之所以快,是因為其省去了大量磁頭尋址的時間。
零拷貝技術:“零拷貝技術”只用將磁盤文件的數據復制到頁面緩存中一次,然后將數據從頁面緩存直接發送到網絡中(發送給不同的訂閱者時,都可以使用同一個頁面緩存),避免了重復復制操作。如果有10個消費者,傳統方式下,數據復制次數為4*10=40次,而使用“零拷貝技術”只需要1+10=11次,一次為從磁盤復制到頁面緩存,10次表示10個消費者各自讀取一次頁面緩存。
Kafka是采用了Java提供NIO包中的的FileChannel的transfer方法實現了高性能的IO傳輸操作,FileChannel提供了transferTo和transferFrom方法,都是采用了調用底層操作系統的sendfile函數來實現的CPU零拷貝機制。
Topic分區:kafka對每個Topic進行分區提高了并發,也提高了效率。

kafka的特點

①類似于消息隊列和商業的消息系統,kafka提供對流式數據的發布和訂閱
②kafka提供一種持久的容錯的方式存儲流式數據
③kafka擁有良好的性能,可以及時地處理流式數據
④每條記錄由一個鍵,一個值和一個時間戳組成

kafka的核心組成

1.Broker
一臺kafka服務器就是一個broker。一個集群由多個broker組成,每個broker就是一個kafka的實例。
2.Topic
Topic 就是數據主題,kafka建議根據業務系統將不同的數據存放在不同的topic中!Kafka中的Topics總是多訂閱者模式,一個topic可以擁有一個或者多個消費者來訂閱它的數據。一個大的Topic可以分布式存儲在多個kafka broker中!Topic可以類比為數據庫中的庫!
3.Interceptor
Interceptor 為攔截器,當生產者向kafka發送數據時,數據會先經過攔截器進行攔截處理,多個攔截器可以組成攔截器鏈,然后再真正發送數據doSend()。
4.Partition
每個topic可以有多個分區,通過分區的設計,topic可以不斷進行擴展!即一個Topic的多個分區分布式存儲在多個broker;此外通過分區還可以讓一個topic被多個consumer進行消費!以達到并行處理!分區可以類比為數據庫中的表!kafka只保證按一個partition中的順序將消息發給consumer,不保證一個topic的整體(多個partition間)的順序。
經過攔截器過濾的代碼后,會被進行分區,如果沒有指定分區,才會走分區器,所以如果想要自定義分區,不能指定分區
5.Offset
生成者每生產一條數據都會追加到指定分區的log文件中,且存儲的記錄都是有序的,由于不可隨機寫入,所以順序是不變的,這個順序是通過一個稱之為offset的id來唯一標識。
kafka自動維護消費者消費的主題各個分區的offset,前提是消費者消費的分區是由kafka分配的,在啟動消費者時,只指定了主題,沒有指定分區,kafka會將offset數據保存到一個內置主題為__consumer_offsets的主題中,如果指定了分區,那么kafka將不再自動維護offset。
6.Persistence
Persistence即持久化,Kafka 集群保留所有發布的記錄,無論他們是否已被消費,都會通過一個可配置的參數:保留期限來控制。舉個例子, 如果保留策略設置為2天,一條記錄發布后兩天內,可以隨時被消費,兩天過后這條記錄會被清除并釋放磁盤空間。
Kafka的性能和數據大小無關,所以長時間存儲數據沒有什么問題
7.Replication
Replication,即副本,每個分區可能會有多個副本,同一個主題每個分區之間的副本都會選出一個leader,而producer與consumer只與leader之間進行交互,其他follower副本則從leader中同步數據。
8.Producer
消息生產者,就是向kafka broker發消息的客戶端。生產者負責將記錄分配到topic的指定 partition(分區)中,如果沒有指定分區,則都卡夫卡依據分區策略進行分配。
9.Consumer
消息消費者,向kafka broker取消息的客戶端。每個消費者都要維護自己讀取數據的offset。低版本0.9之前將offset保存在Zookeeper中,0.9及之后保存在Kafka的“__consumer_offsets”主題中
consumer采用pull(拉)模式從broker中讀取數據
pull模式不足之處是,如果kafka沒有數據,消費者可能會陷入循環中,一直返回空數據。針對這一點,Kafka的消費者在消費數據時會傳入一個時長參數timeout,如果當前沒有數據可供消費,consumer會等待一段時間之后再返回,這段時長即為timeout。
10.Consumer Group
每個消費者都會使用一個消費組名稱來進行標識。同一個組中的不同的消費者實例,可以分布在多個進程或多個機器上!
如果所有的消費者實例在同一消費組中,消息記錄會負載平衡到每一個消費者實例(單播)。即每個消費者可以同時讀取一個topic的不同分區!
如果所有的消費者實例在不同的消費組中,每條消息記錄會廣播到所有的消費者進程(廣播)。
如果需要實現廣播,只要每個consumer有一個獨立的組就可以了。要實現單播只要所有的consumer在同一個組。
一個topic可以有多個consumer group。topic的消息會復制(不是真的復制,是概念上的)到所有的CG,但每個partion只會把消息發給該CG中的一個consumer。

Kafka中的Topic和Partition有什么關系?

在Kafka中,Topic和Partition是兩個密切相關的概念。

  1. Topic是Kafka中消息的邏輯分類,可以看作是一個消息的存儲類別。它是按照不同的主題對消息進行分類,并且可以用于區分和篩選數據。每個Topic可以有多個Partition,每個Partition都是Topic的一個子集,包含了一部分特定的消息。
  2. Partition則是Kafka 中實際保存數據的單位。每個Topic可以被劃分為多個Partition,而這些 Partition 會盡量平均的分配到各個 Broker 上。當一條消息發送到Kafka時,它會被分配到一個特定的Partition中,并最終寫入 Partition 對應的日志文件里。這個分配過程是根據Partition的規則來完成的,比如可以按照消息的某個屬性進行哈希或者按照時間戳進行排序等。

因此,Topic和Partition的關系是,Topic是消息的邏輯分類,用于區分和篩選數據,而Partition則是Topic的物理劃分,用于將消息分配到不同的部分中以便于處理和存儲。Topic 和 Partition 的設計對于高吞吐量和橫向擴展非常有用。因為生產者和消費者只需要根據 Topic 進行具體的業務實現,而不用關心消息在集群內的分布情況。而在集群內部,這些 Partition 會盡量平均的分布在不同的 Broker節點上,從而提高了系統 整體的性能和可伸縮性。

Kafka的消費消息是如何傳遞的?

在Kafka中,消息的傳遞主要涉及三個環節:生產者生產消息、broker保存消息和消費者消費消息。

  1. 生產者生產消息:生產者負責將消息發布到Kafka broker。在發布消息時,生產者需要指定目標主題。消息被寫入后,將被存儲在指定分區的當前副本中。當發送消息失敗時,生產者還會提供確認以及重試機制,以保證消息能夠正確的發送到 Broker 上。
  2. broker保存消息:Kafka broker接收到生產者發送的消息后,會將其存儲在內部的緩沖區中,等待消費者拉取。當消費者向broker發送拉取請求時,broker會從緩沖區中獲取消息并返回給消費者。Kafka broker能夠保證消息的可靠性和順序性,即使在異常情況下(如服務器崩潰),也能夠保證消息不會丟失。
  3. 消費者消費消息:消費者從Kafka broker中訂閱指定的主題,并拉取消息進行消費。消費者可以以同步或異步的方式拉取消息,并對拉取到的消息進行處理。當消費者處理完消息后,會向Kafka broker發送確認消息,表示消息已經被成功處理。這樣可以保證消息被正確處理且不會重復消費。

總體來說,Kafka通過生產者、Kafka broker和消費者的協同工作,實現了高吞吐量、高可靠性和高可擴展性的消息傳遞。

Kafka 的多副本機制了解嗎?

Kafka 為分區(Partition)引入了多副本(Replica)機制。分區(Partition)中的多個副本之間會有一個叫做 leader 的家伙,其他副本稱為 follower。我們發送的消息會被發送到 leader 副本,然后 follower 副本才能從 leader 副本中拉取消息進行同步。
生產者和消費者只與 leader 副本交互。你可以理解為其他副本只是 leader 副本的拷?,它們的存在只是為了保證消息存儲的安全性。當 leader 副本發生故障時會從 follower 中選舉出一個 leader,但是 follower 中如果有和leader 同步程度達不到要求的參加不了 leader 的競選。

Kafka 的多分區(Partition)以及多副本(Replica)機制有什么好處呢?

Kafka 通過給特定 Topic 指定多個 Partition,而各個 Partition 可以分布在不同的 Broker 上,這樣便能提供比較好的并發能力(負載均衡)。
Partition 可以指定對應的 Replica 數,這也極大地提高了消息存儲的安全性,提高了容災能力,不過也相應的增加了所需要的存儲空間。

Kafka 如何保證消息的消費順序?

我們在使用消息隊列的過程中經常有業務場景需要嚴格保證消息的消費順序,比如我們同時發了2 個消息,這2 個消息對應的操作分別對應的數據庫操作是:

  • 更改用戶會員等級。
  • 根據會員等級計算訂單價格。假如這兩條消息的消費順序不一樣造成的最終結果就會截然不同。 Kafka 中Partition(分區)是真正保存消息的地方,我們發送的消息都被放在了這里。而我們的 Partition(分區)又存在于 Topic(主題)這個概念中,并且我們可以給特定 Topic 指定多個
    Partition。

每次添加消息到 Partition(分區)的時候都會采用尾加法,如上圖所示。 Kafka 只能為我們保證 Partition(分區)中的消息有序。
消息在被追加到 Partition(分區)的時候都會分配一個特定的偏移量(offset)。Kafka 通過偏移量(offset)來保證消息在分區內的順序性。所以,我們就有一種很簡單的保證消
息消費順序的方法:1 個 Topic 只對應一個 Partition。這樣當然可以解決問題,但是破壞了 Kafka 的設計初衷。 Kafka 中發送1 條消息的時候,可以指定 topic, partition, key,data(數據)4 個參數。如果你發送消息的時候指定了 Partition 的話,所有消息都會被發送到指定的 Partition。并且,同一個 key 的消息可以保證只發送到同一個 partition,這個我們可以采用表/對象的 id 來作為 key。
總結一下,對于如何保證 Kafka 中消息消費的順序,有了下面兩種方法:

  • 1 個 Topic 只對應一個 Partition。
  • 發送消息的時候指定 key/Partition。

Kafka 如何保證消息不丟失?

  • 生產者丟失消息的情況
    生產者(Producer)調用 send 方法發送消息之后,消息可能因為網絡問題并沒有發送過去。
    所以,我們不能默認在調用 send 方法發送消息之后消息發送成功了。為了確定消息是發送成功,我們要判斷消息發送的結果。但是要注意的是 Kafka 生產者(Producer)使用 send 方法發送消息實際上是異步的操作,我們可以通過 get()方法獲取調用結果,但是這樣也讓它變為了同步操作。
  • 消費者丟失消息的情況
    我們知道消息在被追加到 Partition(分區)的時候都會分配一個特定的偏移量(offset)。偏移量(offset)表示 Consumer 當前消費到的 Partition(分區)的所在的位置。Kafka 通過偏移量(offset)可以保證消息在分區內的順序性。
    當消費者拉取到了分區的某個消息之后,消費者會自動提交了 offset。自動提交的話會有一個問題,試想一下,當消費者剛拿到這個消息準備進行真正消費的時候,突然掛掉了,消息實際上并沒有被消費,但是 offset 卻被自動提交了。
    解決辦法也比較粗暴,我們手動關閉自動提交 offset,每次在真正消費完消息之后再自己手動提交 offset 。但是,細心的朋友一定會發現,這樣會帶來消息被重新消費的問題。比如你剛剛消費完消息之后,還沒提交 offset,結果自己掛掉了,那么這個消息理論上就會被消費兩次。

Kafka如何保證消息可靠?

為了保證消息在傳遞過程當中,消息不會丟失或者被重復傳遞,Kafka 設計了非常多的重要機制來保證消息的可靠性。例如

  1. 數據冗余:Kafka通過將消息副本(replica)的方式來實現數據冗余,每個topic都可以配置副本數量,副本數量越多,數據可靠性越高,但會占用更多的存儲空間和網絡帶寬。在 Kafka 中,針對每個 Partition,會選舉產生一個 Leader 節點,負責響應客戶端的請求,并優先保存消息。而其他節點則作為 Follower 節點,負責備份 Master 節點上的消息。
  2. 消息發送確認機制:Kafka支持對生產者發送過來的數據進行校驗,以檢查數據的完整性。可以通過設置生產者端的參數(例如:acks)來配置校驗方式。配置為 0,則不校驗生產者發送的消息是否寫入 Broker。配置為 1,則只要消息在 Leader 節點上寫入成功后就向生產者返回確認信息。配置為-1 或 all,則會等所有 Broker 節點上寫入完成后才向生產者返回確認信息。
  3. ISR機制:針對每個 Partition,Kafka 會維護一個 ISR 列表,里面記錄當前處于同步狀態的所有Partition。并通過 ISR 機制確保消息不會在Master 故障時丟失。
  4. 消息持久化:Kafka將消息寫入到磁盤上,而不是僅在內存中緩存。這樣可以保證即使在系統崩潰的情況下,消息也不會丟失。并且使用零拷貝技術提高消息持久化的性能。
  5. 消費者確認機制:Kafka消費者在處理完消息后會向Kafka broker發送確認消息,表示消息已經被成功處理。如果消費者未發送確認消息,則Kafka broker會保留消息并等待消費者再次拉取。這樣可以保證消息被正確處理且不會重復消費。

這些機制的組合確保了 Kafka 中消息的高可靠性和持久性,使得 Kafka 成為可靠的消息傳遞系統,適用于各種實時數據處理和日志聚合需求。

Kafka 判斷一個節點是否還活著有那兩個條件?

  • 節點必須可以維護和 ZooKeeper 的連接,Zookeeper 通過心跳機制檢查每個節點的連接;
  • 如果節點是個 follower,他必須能及時的同步 leader 的寫操作,延時不能太久。

producer 是否直接將數據發送到 broker 的 leader(主節點)?

producer 直接將數據發送到 broker 的 leader(主節點),不需要在多個節點進行分發,為了
幫助 producer 做到這點,所有的 Kafka 節點都可以及時的告知:哪些節點是活動的,目標
topic 目標分區的 leader 在哪。這樣 producer 就可以直接將消息發送到目的地了。

Kafka consumer 是否可以消費指定分區消息嗎?

Kafa consumer 消費消息時,向 broker 發出"fetch"請求去消費特定分區的消息,consumer 指定消息在日志中的偏移量(offset),就可以消費從這個位置開始的消息,customer 擁有了offset 的控制權,可以向后回滾去重新消費之前的消息,這是很有意義的。

Kafka 高效文件存儲設計特點是什么?

  • Kafka 把 topic 中一個 parition 大文件分成多個小文件段,通過多個小文件段,就容易定期清除或刪除已經消費完文件,減少磁盤占用。
  • 通過索引信息可以快速定位 message 和確定 response 的最大大小。
  • 通過 index 元數據全部映射到 memory,可以避免 segment file 的 IO 磁盤操作。
  • 通過索引文件稀疏存儲,可以大幅降低 index 文件元數據占用空間大小。

partition 的數據如何保存到硬盤?

topic 中的多個 partition 以文件夾的形式保存到 broker,每個分區序號從0 遞增,且消息有序。Partition 文件下有多個 segment(xxx.index,xxx.log),segment 文件里的大小和配置文件大小一致可以根據要求修改,默認為1g。如果大小大于1g 時,會滾動一個新的segment 并且以上一個 segment 最后一條消息的偏移量命名。

kafka 生產數據時數據的分組策略是怎樣的?

生產者決定數據產生到集群的哪個 partition 中,每一條消息都是以(key, value)格式,Key 是由生產者發送數據傳入,所以生產者(key)決定了數據產生到集群的哪個 partition。

consumer 是推還是拉?

customer 應該從 brokes 拉取消息還是 brokers 將消息推送到 consumer,也就是 pull 還 push。在這方面,Kafka 遵循了一種大部分消息系統共同的傳統的設計:producer 將消息推送到 broker,consumer 從 broker 拉取消息。 push 模式,將消息推送到下游的 consumer。這樣做有好處也有壞處:由 broker 決定消息推送的速率,對于不同消費速率的 consumer 就不太好處理了。消息系統都致力于讓 consumer 以最大的速率最快速的消費消息,但不幸的是,push 模式下,當 broker 推送的速率遠大于 consumer 消費的速率時, consumer 恐怕就要崩潰了。最終 Kafka 還是選取了傳統的 pull 模式。

kafka 維護消費狀態跟蹤的方法有什么?

大部分消息系統在 broker 端的維護消息被消費的記錄:一個消息被分發到 consumer 后 broker 就?上進行標記或者等待 customer 的通知后進行標記。這樣也可以在消息在消費后立?就刪除以減少空間占用。

是什么確保了 Kafka 中服務器的負載平衡?

由于領導者的主要?色是執行分區的所有讀寫請求的任務,而追隨者被動地復制領導者。因 此,在領導者失敗時,其中一個追隨者接管了領導者的?色。基本上,整個過程可確保服務 器的負載平衡。

消費者 API 的作用是什么?

允許應用程序訂閱一個或多個主題并處理生成給它們的記錄流的 API,我們稱之為消費者 API。

流 API 的作用是什么?

一種允許應用程序充當流處理器的 API,它還使用一個或多個主題的輸入流,并生成一個輸 出流到一個或多個輸出主題,此外,有效地將輸入流轉換為輸出流,我們稱之為流 API。

Kafka 系統工具有哪些類型?

  • Kafka 遷移工具:它有助于將代理從一個版本遷移到另一個版本。
  • Mirror Maker:Mirror Maker 工具有助于將一個 Kafka 集群的鏡像提供給另一個。 - 消費者檢查:對于指定的主題集和消費者組,它顯示主題,分區,所有者。

Kafka 的流處理是什么意思?

連續、實時、并發和以逐記錄方式處理數據的類型,我們稱之為 Kafka 流處理。

Kafka 集群中保留期的目的是什么?

保留期限保留了 Kafka 群集中的所有已記錄。它不會檢查它們是否已被消耗。此外,可以通 過使用保留期的配置設置來丟棄記錄,而且,它可以釋放一些空間。

Kafka與RabbitMQ相比有什么優勢?

Kafka 和 RabbitMQ 都是流行的消息中間件系統,他們各自都有一些優勢和適用場景。以下是 Kafka 相對于 RabbitMQ 的一些比較明顯的優勢:

  1. 分布式架構: Kafka 是為大規模分布式流處理而設計的,具有高度可伸縮性。RabbitMQ 雖然也支持分布式架構,但相對而言,Kafka 的集群設計更完善,更適合處理大規模的消息流。
  2. 吞吐量: Kafka每秒可處理十幾萬消息,而 RabbitMQ 每秒可處理幾萬條消息。
  3. 消息復制和可用性:Kafka 允許配置多個消息副本,確保數據的冗余存儲,提高可用性和容錯性。RabbitMQ 也支持鏡像隊列以實現冗余,但是不如 Kafka 的多副本復制靈活。
  4. 時間溯源:Kafka 在事件溯源和事件驅動架構中非常強大。他允許事件在 Topic 中保留一段時間,以便后續的分析和回溯查詢。RabbitMQ 通常用于實時消息傳遞,對于事件溯源不夠靈活。
  5. 批處理和流處理: Kafka 提供了流處理 API,課用于實時數據流處理等場景。而 RabbitMQ 傾向于更專注的處理實時消息傳遞。
  6. 社區和生態系統:Kafka 有一個龐大的社區和豐富的生態系統,提供了許多與大數據和流處理相關的工具和庫。RabbitMQ 也有一個活躍的社區,但是相對而言社區規模以及社區活躍性就要小很多。

如果您需要處理大規模的實時數據流或事件驅動架構,Kafka 可能更適合;如果您更關注傳統的消息傳遞和隊列處理,RabbitMQ 的高級功能更豐富,可能更合適。因此,選擇哪種消息中間件還是要取決于具體的應用場景。

如何確保Kafka集群的高可用?

Kafka設計了多種機制,共同保證集群的高可用性:

  1. 分布式架構:Kafka集群通常由多個Broker組成,每個Broker存儲部分數據副本。這樣,即使某個Broker出現故障,其他Broker也可以繼續處理和存儲消息,從而保證整體的高可用性。
  2. 數據冗余:Kafka通過數據冗余來保證高可用性。每個Topic的數據會被分成多個Partition,并在多個Broker上進行復制。即使某個Broker出現故障,數據仍然可以從其他Broker中獲取。
  3. 副本機制:副本是Kafka實現高可用性的重要手段。Kafka中的每個Partition都有多個副本,這些副本分布在不同的Broker上,從而在部分Broker故障時,仍然有足夠的副本可用以保證高可用性。
  4. 分區領導者選舉:在Kafka中,每個Partition都有一個領導者(Leader)和零個或多個追隨者(Follower)。當領導者不可用時,追隨者會進行領導者選舉,以保證系統的可用性。
  5. 消費者組實現負載均衡:Kafka的消費者可以組成消費者組,通過消費者組,可以將負載均勻地分配到多個消費者上,從而避免單個消費者的性能瓶頸,提高整個Kafka集群的可用性。
  6. 故障檢測和恢復: Kafka 會使用 Zookeeper 等組件協助監控和管理集群的狀態。當檢測到故障節點時,就會自動將不可用的節點從集群中排除。而等到故障節點恢復后,也會重新將節點加入到集群當中。

集群高可用性是 Kafka非常關鍵的設計之一。通過多項機制組合,使得 Kafka 可以成為處理關鍵業務數據的可信平臺。

Kafka中的消費者偏移量是如何管理的?

在Kafka中,消費者偏移量是指消費者在處理消息過程中所處的位置。Kafka中的消費者偏移量由兩部分組成:Topic和Partition。對于每個消費者組,Kafka都會為其維護在每個 Partition 上的偏移量,以便在處理消息時可以準確地跟蹤進度。
消費者偏移量的管理可以通過以下方式進行:

  1. 手動提交偏移量:消費者可以通過調用commitSync或commitAsync方法手動提交偏移量到Kafka。手動提交偏移量的方式需要開發者在適當的時機調用提交方法,確保消費者處理完消息后再提交偏移量。這種方式對于靈活性和精確控制偏移量非常有用,但需要開發者自行考慮提交的時機和異常處理。
  2. 自動提交偏移量:消費者可以配置為在后臺自動提交偏移量。這意味著消費者會定期自動將已經處理的消息的偏移量提交給Kafka,而不需要開發者手動處理。通過配置參數enable.auto.commit為true,以及設置auto.commit.interval.ms參數來控制自動提交的頻率。自動提交偏移量簡化了管理,但可能會導致消息的重復處理或丟失,因此需要根據具體業務場景謹慎配置。

總之,Kafka 消費者的偏移量管理是確保消息傳遞的可靠性和一致性的重要部分。它允許消費者靈活地管理消息的消費進度,以滿足不同的應用需求。無論您選擇自動還是手動管理偏移量,都需要確保偏移量的正確提交,以避免消息的重復消費。

Kafka中的消息如何分配給不同的消費者?

Kafka中的消息是通過分區(Partition)分配給不同的消費者的。Kafka將每個Topic劃分為多個Partition,每個Partition存儲一部分消息。消費者通過訂閱Topic來消費消息,而Kafka將Partition中的消息按照一定的分配策略分配給消費者組中的不同消費者。
Kafka提供了多種分區分配策略,用于確定如何將分區分配給消費者。例如:

  1. RoundRobin 輪詢策略:Kafka將Partition按照輪詢的方式分配給消費者組中的不同消費者,每個消費者依次獲得一個Partition,直到所有Partition被分配完畢。當消費者數量發生變化時,Kafka會重新分配Partition。
  2. Range 范圍策略:Kafka將Partition按照Range的方式分配給消費者組中的不同消費者,每個消費者負責處理指定范圍內的Partition。這種分配方式適用于Topic的Partition數量較少,而消費者數量較多的情況。
  3. Sticky 粘性策略: 盡量保持每個消費者在一段時間內消費相同的分區,以減少分區重新分配的頻率

當消費者處理完一個Partition中的所有消息后,它會向Kafka發送心跳請求,Kafka會將該Partition分配給其他消費者進行處理。這種機制確保了消息在不同的消費者之間負載均衡,并提高了容錯性。如果一個消費者出現故障,其他消費者可以繼續處理Partition中的消息,而不會導致消息丟失或重復處理。

什么是“零拷貝”?有什么作用?

零拷貝是操作系統提供的一種優化 IO 操作的重要機制。通過零拷貝技術,操作系統可以極大的減少在一次 IO 操作中,數據從一個內存區域復制到另一個內存區域的次數,以及在此過程中對 CPU 的性能消耗。零拷貝技術可以極大的提高數據傳輸的效率,避免不必要的數據拷貝,從而降低系統負載。
零拷貝有兩種實現方式,mmap文件映射和sendfile文件復制。

  • mmap機制主要依賴于內存區域映射技術,可以減少一次 IO 操作中,內核態與用戶態之間的數據傳輸,從而減少因為上下文切換而帶來的 CPU 性能開銷。mmap機制通常適合于對大量小文件的 IO 操作,Kafka 大量的運用 mmap 機制加速 Partition 日志文件的讀寫過程。
  • sendfile主要依賴于 DMA 數據傳輸技術,采用一組單獨的指令集來進行負責數據在內存不同區域之間的拷貝過程。這樣就不再需要 CPU 來進行復制,從而減少 CPU 性能消耗,讓 CPU 可以用于更重要的計算任務。sendfile通常適合于大文件的拷貝傳輸操作,Kafka 大量的運用 sendfile 機制,加速消息從 Partition 文件到網卡的傳輸過程。

總之,零拷貝是由操作系統提供的一種高效的文件讀寫技術,而 Kafka 則大量的運用了零拷貝技術,從而極大的提升了 Kafka 整體的工作性能。

Kafka中的消息是如何存儲的?

Kafka 中的消息是以文件的方式持久化到磁盤中進行存儲的,這是 Kafka 的一個關鍵特性,確保消息的可靠性和可用性。Kafka中的消息是通過以下方式進行存儲的:

  1. Partition 分區:Partition是Kafka中消息存儲的基本單位,每個Topic下的消息都會被劃分成多個Partition進行管理。每個Partition都是一個有序的、不變的消息隊列,消息按照追加的順序被添加到隊列尾部。
  2. Segment 分塊:Partition會被進一步劃分成多個Segment,Segment是邏輯上的文件組,方便進行數據的管理和查找。每個Segment里都包含多個文件,這些文件名相同且被集合在一起。
  3. 文件索引:Segment中的每個文件都有自己的索引文件和數據文件,索引文件存儲了當前數據文件的索引信息,而數據文件則存儲了當前索引文件名對應的數據信息。
  4. 消息偏移:Kafka中的每個消息都會被分配到一個特定的Partition中,然后根據Partition內的Segment劃分,被存儲到對應的數據文件中。消息的偏移量信息則會被記錄在索引文件中。
  5. 持久化:Kafka中的每個消息都包含一個64位的偏移量,該偏移量表示消息在Partition中的位置。當消費者讀取消息時,可以通過偏移量信息來確定需要從哪個位置開始讀取。

Kafka 的消息存儲是基于日志文件和分區的,確保了消息的可靠性、持久性和高吞吐量。消息被追加到日志文件中,每個消息都有唯一的偏移量,分區和副本機制保證了數據的冗余存儲和可用性。這種設計使 Kafka 成為一個可信賴的消息傳遞系統,適用于各種實時數據處理、日志聚合和事件驅動應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164427.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32:基本定時器原理和定時程序

一、初識定時器TIM 定時器就是計數器,定時器的作用就是設置一個時間,然后時間到后就會通過中斷等方式通知STM32執行某些程序。定時器除了可以實現普通的定時功能,還可以實現捕獲脈沖寬度,計算PWM占空比,輸出PWM波形&am…

Vue3 + Vite + TSX + vue3-ace-editor 踩坑

前言 由于 ace-editor 官網并沒有提供各個前端框架Vue,React,Angular的直接使用的適配版本, 所以本次使用的vue3-ace-editor 是個人開源者維護的版本,原生是支持 SFC 模版用的,由于我這里習慣使用 JSX 或 TSX的方式&a…

【03】ES6:解構賦值

一、數組的解構賦值 ES6 允許按照一定模式,從數組和對象中提取值,對變量進行賦值,這被稱為解構(Destructuring)。 1、基本使用 遵循 “模式匹配” ,索引值相同的完成賦值 // 為變量賦值,只能…

Centos7 Python環境和yum修復

1、刪除現有殘余包 [rootlocalhost ]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# whereis python |xargs rm -frv[rootlocalhost ]# whereis python ##驗證清除&…

mybatis注解方式動態標簽時有特殊符號,出現元素內容必須由格式正確的字符數據或標記組成

原始代碼demo Select("SELECT COUNT(1) FROM AAAA WHERE name #{nage} AND age< 4") public Integer sumXxxxx(String nage, String age);現需求改為nage可以為空&#xff0c;因此使用了動態拼接 Select("<script> SELECT COUNT(1) FROM AAAA WHERE …

SWT/Jface(2): 表格的編輯

前言 上節說到, 創建和渲染表格需要如下幾個步驟: 接收源數據數組(也可以是單個對象或者其他集合類型): TableViewer.setInput(Object)渲染接收的數據 渲染表頭: TableViewer.setLabelProvider(IBaseLabelProvider)渲染內容: TableViewer.setContentProvider(IContentProvide…

java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx

windows系統下連接hdfs進行操作時&#xff0c;上來就出現java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx java.lang.IllegalArgumentException: java.net.UnknownHostException: liujianat org.apache.hadoop.security.SecurityUtil.buildTokenServ…

Keil Vision5—新建工程project

注意&#xff1a;創建的工程目錄必須是純英文目錄 目錄 1.開始配置 2.為該路徑下新建個文件夾 3.選擇器件 4.工程配置 4.右擊魔術棒&#xff0c;設置參數 ?編輯 &#xff08;1&#xff09;target配置 &#xff08;2&#xff09;output配置 &#xff08;3&#xff09;c…

字符串結尾空格比較相關參數BLANK_PAD_MODE(DM8:達夢數據庫)

DM8:達夢數據庫 字符串結尾空格比較相關參數BLANK_PAD_MODE 環境介紹1 BLANK_PAD_MODE01.1 初始化數據庫1.2 創建測試表 T0 2 BLANK_PAD_MODE12.1 初始化數據庫2.2 創建測試表 T1 3 BLANK_PAD_MODE只對字段varchar類型生效3.1 BLANK_PAD_MODE 對char 類型對比無效3.2 在兩個數據…

計算機中了halo勒索病毒怎么清除,halo勒索病毒解密數據恢復

科技的進步加快了企業發展的步伐&#xff0c;網絡技術的不斷應用為企業的生產運營提供了極大幫助&#xff0c;但隨之而來的網絡安全威脅也不斷增加&#xff0c;近期&#xff0c;云天數據恢復中心接到很多企業的求助&#xff0c;企業的計算機服務器遭到了halo勒索病毒攻擊&#…

Jmeter快速入門

文章目錄 1.安裝Jmeter1.1.下載1.2.解壓1.3.運行 2.快速入門2.1.設置中文語言2.2.基本用法 1.安裝Jmeter Jmeter依賴于JDK&#xff0c;所以必須確保當前計算機上已經安裝了JDK&#xff0c;并且配置了環境變量。 1.1.下載 可以Apache Jmeter官網下載&#xff0c;地址&#xf…

uni-app打包后,打開軟件時使其橫屏顯示

找到page.json文件&#xff0c;在global加入以下代碼&#xff1a; 這樣就可以橫屏顯示了。

CANdelaStudio 使用教程 1

文章目錄 CANdelaStudio 軟件下載CANdelaStudio 軟件的權限View Edition 和 Admin Edition 區別&#xff1a;打開文件 CDD / CDDT 文件新建 CDD 文件新建 CDDT 文件CDD 和 CDDT 文件的區別 CANdelaStudio 軟件下載 1、 來到 Vector 官網下載中心 https://www.vector.com/cn/zh…

[shader] 光照入門(未完結。。。

反射 漫反射&#xff1a;而當物體表面粗糙時&#xff0c;我們把物體表面看作無數不同方向的微小鏡面&#xff0c;則這些鏡面反射出的光方向均不相同&#xff0c;這就是漫反射。 高光反射&#xff1a;我們假定物體表面光滑&#xff0c;只有一個鏡面&#xff0c;那么所有的光都…

報錯For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

.報錯For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 報錯信息如下&#xff1a; ./aten/…

力扣labuladong——一刷day46

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、力扣971. 翻轉二叉樹以匹配先序遍歷二、力扣987. 二叉樹的垂序遍歷三、力扣666. 路徑總和 IV 前言 二叉樹的遞歸分為「遍歷」和「分解問題」兩種思維模式&a…

面試:RocketMQ相關問題

文章目錄 什么是 RocketMQ&#xff0c;有哪些使用場景&#xff1f;RocketMQ 由哪些?色組成&#xff0c;每個?色作用和特點是什么&#xff1f;RocketMQ 中的 Topic 和 JMS 的 queue 有什么區別&#xff1f;RocketMQ 消費模式有幾種&#xff1f;RocketMQ 的 Consumer 是如何消費…

【深度學習】Python快捷調用InsightFace人臉檢測,純ONNX推理

pypi資料&#xff1a; https://pypi.org/project/insightface/ 模型選擇&#xff1a; https://github.com/deepinsight/insightface/tree/master/python-package#model-zoo onnxruntime的GPU對應CUDA &#xff1a; https://onnxruntime.ai/docs/reference/compatibility …

1999-2021年地級市城鎮居民人均消費性支出數據

1999-2021年地級市城鎮居民人均消費性支出數據 1、時間&#xff1a;1999-2021年 2、指標&#xff1a;城鎮居民人均消費性支出 3、范圍&#xff1a;290個地級市 4、來源&#xff1a;城市年鑒、地級市統計公報 5、指標解釋&#xff1a; 城鎮居民人均消費性支出&#xff1a;指…

kubesphere安裝依賴文件

yum install socat -y yum install conntrack -y