一. 介紹
kafka使用scala開發(fā),支持多語言客戶端(c++牵署、java漏隐、python、go等)其架構如下:
Producer:消息發(fā)布者
Broker:消息中間件處理結點奴迅,一個kafka節(jié)點就是一個broker
Consumer:消息訂閱者
kafka的消息分幾個層次:
1) Topic:一類消息青责,例如page view日志挺据,click日志等都可以以topic的形式存在,kafka集群能夠同時負責多個topic的分發(fā)
2) Partition: Topic物理上的分組脖隶,一個topic可以分為多個partition扁耐,每個partition是一個有序的隊列。partition中的每條消息都會被分配一個有序的id(offset)产阱。
3) Message:消息婉称,最小訂閱單元
二.具體消息流程:
1. Producer根據指定的partition方法(round-robin、hash等)构蹬,將消息發(fā)布到指定topic的partition里面
2. kafka集群接收到Producer發(fā)過來的消息后王暗,將其持久化到硬盤,并保留消息指定時長(可配置)庄敛,而不關注消息是否被消費俗壹。
3. Consumer從kafka集群pull數(shù)據,并控制獲取消息的offset
三. 設計
ThroughPut
High Throughput是kafka需要實現(xiàn)的核心目標之一藻烤,為此kafka做了以下一些設計:
1)數(shù)據磁盤持久化:消息不在內存中cache绷雏,直接寫入到磁盤,充分利用磁盤的順序讀寫性能
2)zero-copy:減少IO操作步驟
3)數(shù)據批量發(fā)送
4)數(shù)據壓縮
5)Topic劃分為多個partition怖亭,提高parallelism
負載均衡:
1) producer根據用戶指定的算法涎显,將消息發(fā)送到指定的partition
2) 存在多個partiiton,每個partition有自己的replica依许,每個replica分布在不同的Broker節(jié)點上
3) 多個partition需要選取出lead partition棺禾,lead partition負責讀寫,并由zookeeper負責fail over
4) 通過zookeeper管理broker與consumer的動態(tài)加入與離開
pull-based system
由于kafka broker會持久化數(shù)據峭跳,broker沒有內存壓力膘婶,因此,consumer非常適合采取pull的方式消費數(shù)據蛀醉,具有以下幾點好處:
1)簡化kafka設計
2)consumer根據消費能力自主控制消息拉取速度
3)consumer根據自身情況自主選擇消費模式悬襟,例如批量,重復消費拯刁,從尾端開始消費等
Scale Out
當需要增加broker結點時脊岳,新增的broker會向zookeeper注冊,而producer及consumer會根據注冊在zookeeper上的watcher感知這些變化垛玻,并及時作出調整割捅。