什麼是Kafka MQ
Kafka MQ是一個高吞吐量分散式訊息系統。是由linkedin開源的訊息中間件。 Kafka就跟這個名字一樣,設計非常獨特
特點
kafka的開發者們認為不需要在記憶體里快取什麼數據,作業系統的檔案快取已經足夠完善和強大,只要你不搞隨機寫,順序讀寫的性能是非常高效的。
kafka的數據只會順序append,數據的刪除策略是累積到一定程度或者超過一定時間再刪除。
Kafka另一個獨特的地方是將消費者信息保存在客戶端而不是MQ伺服器,這樣伺服器就不用記錄訊息的投遞過程,每個客戶端都自己知道自己下一次應該從什麼地方什麼位置讀取訊息,訊息的投遞過程也是採用客戶端主動pull的模型,這樣大大減輕了伺服器的負擔。
Kafka還強調減少數據的序列化和拷貝開銷,它會將一些訊息組織成Message Set做批量存儲和傳送,並且客戶端在pull數據的時候,儘量以zero-copy的方式傳輸,利用sendfile(對應java里的 FileChannel.transferTo/transferFrom)這樣的高級IO函式來減少拷貝開銷。
可見,kafka是一個精心設計,特定於某些套用的MQ系統,這種偏向特定領域的MQ系統我估計會越來越多,垂直化的產品策略值的考慮。
kafka是一種高吞吐量的分散式發布訂閱訊息系統,她有如下特性: 通過O(1)的磁碟數據結構提供訊息的持久化,這種結構對於即使數以TB的訊息存儲也能夠保持長時間的穩定性能。
高吞吐量:即使是非常普通的硬體kafka也可以支持每秒數十萬的訊息。
支持通過kafka伺服器和消費機集群來分區訊息。
支持Hadoop並行數據載入。
卡夫卡的目的是提供一個發布訂閱解決方案,它可以處理消費者規模的網站中的所有動作流數據。 這種動作(網頁瀏覽,搜尋和其他用戶的行動)是在現代網路上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。
對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。kafka的目的是通過Hadoop的並行載入機制來統一線上和離線的訊息處理,也是為了通過集群機來提供實時的消費。 設計側重高吞吐量,用於好友動態,相關性統計,排行統計,訪問頻率控制,批處理等系統。 傳統的離線分析方案是使用日誌檔案記錄數據,然後集中批量處理分析。
這種方式對於實時性要求很高的活動流數據不適合,而大部分的訊息中間件能夠處理實時性要求高的訊息/數據,但是對於佇列中大量未處理的訊息/數據在持久性方面比較弱。
設計理念
持久化訊息 高吞吐量 consumer決定訊息狀態 系統中各個角色都是分散式集群 consumer有邏輯組的概念,每個consumer進程屬於一個consumer組,每個訊息會發給每個關注此訊息的consumer組中的某一個consumer進程。 Linkedin使用了多個consumer組,每個組多個相同職責的consumer進程。
部署架構
訊息的持久化和快取
Kafka使用磁碟檔案做持久化,磁碟檔案的讀寫速度在於如何使用,隨機寫比順序寫慢的多,現代os會在記憶體回收對性能影響不大的情況下儘量使用記憶體cache進行磁碟的合併寫。所以用戶進程再做一次快取沒有太大必要。Kafka的讀寫都是順序的,以append方式寫入檔案。
為減少記憶體copy,kafka使用sendfile傳送數據,通過合併message提升性能。
Kafka不儲存每個訊息的狀態,而使用(consumer,topic,partition)保存每個客戶端狀態,大大減小了維護每個訊息狀態的麻煩。
在訊息的推vs拉的選擇上,kafka使用拉的方式,因為推的方式會因為各個客戶端的處理能力、流量等不同產生不確定性。
負載均衡
Producers和brokers通過硬體做負載均衡,brokers和consumers都以集群方式運行,通過zookeeper協調變更和成員管理