Kafka在大數據流式處理場景當中,正在受到越來越多的青睞,尤其在實時消息處理領域,kafka的優勢是非常明顯的。相比於傳統的消息中間件,kafka有著更多的潛力空間。今天的大數據開發分享,我們就主要來講講Apache Kafka分布式流式系統。
關於Apache Kafka
本質上來說,Apache Kafka不是消息中間件的一種實現,它只是一種分布式流式系統。不同於基於隊列和交換器的RabbitMQ,Kafka的存儲層是使用分區事務日誌來實現的。
Kafka也提供流式API用於實時的流處理以及連接器API用來更容易的和各種數據源集成。雲廠商為Kafka存儲層提供了可選的方案,比如Azure Event Hubsy以及AWS Kinesis Data Streams等。這些都是Kafka流處理能力受到肯定的見證。
Kafka主題
Kafka沒有實現隊列這種東西。相應的,Kafka按照類別存儲記錄集,並且把這種類別稱為主題。
Kafka為每個主題維護一個消息分區日誌。每個分區都是由有序的不可變的記錄序列組成,並且消息都是連續的被追加在尾部。
當消息到達時,Kafka就會把他們追加到分區尾部。默認情況下,Kafka使用輪詢分區器(partitioner)把消息一致的分配到多個分區上。
Kafka可以改變創建消息邏輯流的行為。例如,在一個多租戶的應用中,我們可以根據每個消息中的租戶ID創建消息流。
IoT場景中,我們可以在常數級別下根據生產者的身份信息(identity)將其映射到一個具體的分區上。
確保來自相同邏輯流上的消息映射到相同分區上,這就保證了消息能夠按照順序提供給消費者。
Kafka生產者
消費者通過維護分區的偏移(或者說索引)來順序的讀出消息,然後消費消息。
單個消費者可以消費多個不同的主題,並且消費者的數量可以伸縮到可獲取的最大分區數量。
所以在創建主題的時候,我們要認真的考慮一下在創建的主題上預期的消息吞吐量。消費同一個主題的多個消費者構成的組稱為消費者組。
通過Kafka提供的API可以處理同一消費者組中多個消費者之間的分區平衡以及消費者當前分區偏移的存儲。
Kafka消費者
Kafka實現的消息模式
Kafka的實現很好地契合發布/訂閱模式。生產者可以向一個具體的主題發送消息,然後多個消費者組可以消費相同的消息。每一個消費者組都可以獨立的伸縮去處理相應的負載。
由於消費者維護自己的分區偏移,所以他們可以選擇持久訂閱或者臨時訂閱,持久訂閱在重啟之後不會丟失偏移而臨時訂閱在重啟之後會丟失偏移並且每次重啟之後都會從分區中最新的記錄開始讀取。
但是這種實現方案不能完全等價的當做典型的消息隊列模式看待。當然,我們可以創建一個主題,這個主題和擁有一個消費者的消費組進行關聯。這樣我們就模擬出了一個典型的消息隊列。
值得特別注意的是,Kafka是按照預先配置好的時間保留分區中的消息,而不是根據消費者是否消費了這些消息。
這種保留機制可以讓消費者自由的重讀之前的消息。另外,開發者也可以利用Kafka的存儲層來實現諸如事件溯源和日誌審計功能。
關於大數據開發,Apache Kafka分布式流式系統,以上就為大家做了簡單的介紹了。Kafka對實時消息流的處理,尤其是大規模實時消息流的處理,是具備顯著優勢的,掌握Kafka在學習當中非常重要。