Kafka 能用來干嘛?
- 消息隊(duì)列
- 實(shí)時(shí)數(shù)據(jù)處理, 流式處理(一般結(jié)合storm)
- 日志聚合等
Kafka 架構(gòu)

Producer集群通過zookeeper(實(shí)際中寫的是broker list)獲取所寫topic對應(yīng)的partition列表,然后順序發(fā)送消息(支持自己實(shí)現(xiàn)分發(fā)策略),broker集群負(fù)責(zé)消息的存儲和傳遞,支持Master Slaver模型,可分布式擴(kuò)展;Consumer集群從zookeeper上獲取topic所在的partition列表,然后消費(fèi),一個(gè)partition只能被一個(gè)consumer消費(fèi)。Name Server集群(一般是zookeeper)提供名稱服務(wù)等協(xié)調(diào)信息。
Topic
Topic是生產(chǎn)者生產(chǎn)、消費(fèi)者消費(fèi)的隊(duì)列標(biāo)識。一個(gè)Topic由一個(gè)或多個(gè)partition組成,每個(gè)partition可以單獨(dú)存在一個(gè)broker上,消費(fèi)者可以往任一partition發(fā)送消息,以此實(shí)現(xiàn)生產(chǎn)的分布式,任一partition都可以被且只被一個(gè)消費(fèi)者消息,以此實(shí)現(xiàn)消費(fèi)的分布式;因此partition的設(shè)計(jì)提供了分布式的基礎(chǔ)。

同時(shí),從上圖我們也能發(fā)現(xiàn)這種設(shè)計(jì)還有一個(gè)優(yōu)點(diǎn),因?yàn)槊總€(gè)partition內(nèi)的消息是有序的,而一個(gè)partition只能被一個(gè)消費(fèi)者消費(fèi),因此Kafka能提供partition層面的消息有序,而傳統(tǒng)的隊(duì)列在多個(gè)consumer的情況下是完全無法保證有序的。
消息傳遞模型
使用消費(fèi)者組的概念,一個(gè)消息可以被多個(gè)消費(fèi)者組消費(fèi),但是只能被一個(gè)消費(fèi)者組里的一個(gè)消費(fèi)者消費(fèi),這樣當(dāng)只有一個(gè)消費(fèi)者組時(shí)就等同與P2P模型,當(dāng)存在多個(gè)消費(fèi)者組時(shí)就是PUB/SUB模型。

消息持久化
Kafka直接使用頁面緩存, 線性寫入(linear write),以此可同時(shí)支持在線和離線的消費(fèi)。每個(gè)消費(fèi)者自己維護(hù)當(dāng)前讀取數(shù)據(jù)的offset(也可委托給zookeeper)
Push or Pull
對于消息的消費(fèi),ActiveMQ使用PUSH模型,而Kafka使用PULL模型,兩者各有利弊,對于PUSH,broker很難控制數(shù)據(jù)發(fā)送給不同消費(fèi)者的速度,而PULL可以由消費(fèi)者自己控制,但是PULL模型可能造成消費(fèi)者在沒有消息的情況下盲等,這種情況下可以通過long polling機(jī)制緩解,而對于幾乎每時(shí)每刻都有消息傳遞的流式系統(tǒng),這種影響可以忽略。
Ref: http://blog.csdn.net/mengxianhua/article/details/43968429/