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

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