消息收發
- 消息發送,支持指定分區發送、同步發送、異步發送、分區批量累積發送;支持身份認證,客戶端連接Broker時使用SSL或SASL進行驗證,數據傳加密傳輸;支持ACL機制,提供客戶端讀、寫權限認證。支持通過壓縮算法實現消息體壓縮,減少網絡傳輸數據量,提高Kafka的消息發送吞吐量。
- 消息消費,支持指定Partition消費、指定分區的offset消費;采用poll方式,支持批量消費,支持廣播消費。
消息有序性
針對消息有序的業務需求,分為全局有序和局部有序。
- 全局有序:一個Topic下的所有消息都需要按照生產順序消費。
- 局部有序:一個Topic下的消息,只需要滿足同一業務字段的要按照生產順序消費。例如:Topic消息是訂單的流水表,包含訂單orderId,業務要求同一個orderId的消息需要按照生產順序進行消費。
由于Kafka的一個Topic可以分為了多個Partition,Producer發送消息的時候,是分散在不同 Partition的。當Producer按順序發消息給Broker,但進入Kafka之后,這些消息就不一定進到哪個Partition,會導致順序是亂的。因此要滿足全局有序,需要1個Topic只能對應1個Partition。
要滿足局部有序,只需要在發消息的時候指定Partition Key,Kafka對其進行Hash計算,根據計算結果決定放入哪個Partition。這樣Partition Key相同的消息會放在同一個Partition。此時,Partition的數量仍然可以設置多個,提升Topic的整體吞吐量。
消費群組
在kafka中,某些Topic的主題擁有數百萬甚至數千萬的消息量,如果僅僅靠個消費者進程消費,那么消費速度會非常慢。Kafka提供的消費組功能,一個分區只可以被消費組中的一個消費者所消費, 一個消費組中的一個消費者可以消費多個分區。消費組三大優勢消費效率更高、消費模式靈活、便于故障容災。
消息回溯
Kakfa消息寫入Broker后,會保存一段時間。在這段時間內,如果消費者導致消息丟失(比如消費者過早的提交了偏移量,發送故障,進行rebalance),可以通過發送seek指令到消費者,告訴其從具體的偏移量開始重新消費。
消息清理
Kafka每一個分區副本都對應的一個 log 日志文件。而 Log 又分為多個 LogSegement 日志分段,每個片段可以設置大小,當達到上限,就關閉當前文件,打開一個新的文件。這些片段是不能永久保存的,達到一定的條件,就需要清理。Kafka包括基于時間,基于日志大小,基于日志偏移量三種模式。
- 基于時間模式,檢查日志文件中是否有保留時間超過設定的的閥值(log.retention.hours, log.retention.minutes ,log.retention ms三個值配合),符合條件則刪除。比如log.retention.hours設置為24,則保留僅1天的片段數據,其他的都刪除。注意,活躍的片段(正在寫入的片段)是無法刪的,以下幾種模式也一樣。
- 基于日志大小模式,檢查片段文件的大小是否超過設定的閥值(通過log.segment.bytes設置單個片段的大小),符合條件則刪除。
- 基于日志起始偏移量模式,檢查片段文件的偏移量(結束位置)是否小于設置的偏移量閥值,符合條件則刪除。
高吞吐
高吞吐量是Kafka設計的主要目標,Kafka將數據寫到磁盤,充分利用磁盤的順序讀寫。同時,Kafka在數據寫入及數據同步采用了零拷貝(zero-copy)技術,采用sendFile()函數調用,sendFile()函數是在兩個文件描述符之間直接傳遞數據,完全在內核中操作,從而避免了內核緩沖區與用戶緩沖區之間數據的拷貝,操作效率極高。Kafka還支持數據壓縮及批量發送,同時Kafka將每個主題劃分為多個分區,這一系列的優化及實現方法使得Kafka具有很高的吞吐量并經受充分驗證。
高可用
kafka中一個主題下面可以有多個分區(partition),每個分區(partition)可以有多個副本,所以kafka的副本的維度是以分區為維度進行劃分的;同一個分區下的所有副本保存有相同的消息序列,這些副本分散保存在不同的 Broker 上,從而能夠對抗部分 Broker 宕機帶來的數據不可用。在生產環境中,每個分區的副本分布在不同的機器上,這樣即使某些機器出現故障,集群依然可用。