消息中間件kafka簡介
目的及應(yīng)用場景
Kafka是linkedin的分布式消息系統(tǒng),設(shè)計側(cè)重高吞吐量,用于好友動態(tài),相關(guān)性統(tǒng)計,排行統(tǒng)計,訪問頻率控制,批處理等系統(tǒng)。
傳統(tǒng)的離線分析方案是使用日志文件記錄數(shù)據(jù),然后集中批量處理分析。這種方式對于實時性要求很高的活動流數(shù)據(jù)不適合,而大部分的消息中間件能夠處理實時性要求高的消息/數(shù)據(jù),但是對于隊列中大量未處理的消息/數(shù)據(jù)在持久性方面比較弱。
設(shè)計理念
持久化消息
高吞吐量
consumer決定消息狀態(tài)
系統(tǒng)中各個角色都是分布式集群
consumer有邏輯組的概念,每個consumer進程屬于一個consumer組,每個消息會發(fā)給每個關(guān)注此消息的consumer組中的某一個consumer進程。
Linkedin使用了多個consumer組,每個組多個相同職責的consumer進程。
部署架構(gòu)

消息持久化和緩存
Kafka使用磁盤文件做持久化,磁盤文件的讀寫速度在于如何使用,隨機寫比順序?qū)懧亩啵F(xiàn)代os會在內(nèi)存回收對性能影響不大的情況下盡量使用內(nèi)存cache進行磁盤的合并寫。所以用戶進程再做一次緩存沒有太大必要。Kafka的讀寫都是順序的,以append方式寫入文件。
為減少內(nèi)存copy,kafka使用sendfile發(fā)送數(shù)據(jù),通過合并message提升性能。
Kafka不儲存每個消息的狀態(tài),而使用(consumer,topic,partition)保存每個客戶端狀態(tài),大大減小了維護每個消息狀態(tài)的麻煩。
在消息的推vs拉的選擇上,kafka使用拉的方式,因為推的方式會因為各個客戶端的處理能力、流量等不同產(chǎn)生不確定性。
負載均衡
Producers和brokers通過硬件做負載均衡,brokers和consumers都以集群方式運行,通過zookeeper協(xié)調(diào)變更和成員管理。