Kakfa學習筆記(一)——概述
Kafka是一個分散式流處理平臺,一般用作分散式訊息中介軟體
架構
以訊息系統的角度來看,Kafka是基於釋出-訂閱模型,Producer主動發起push,將一條訊息推到Broker(Kafka服務端的一個節點),Consumer主動 通過pull操作去Broker拿訊息,另外還有zookeeper作為一個協調系統去協調建立連線,記錄offset等分散式的操作。題外話:Kafka已經在慢慢地把很多操作由zk移到自己的broker上
Topic和Partition
Kafka裡以Topic作為釋出,訂閱的類別,類似資料庫的表,一個topic可以被多個producer,consumer釋出,訂閱。每一個topic都有自己的partition劃分,一條訊息從釋出到消費只會經過一個partition,所以訊息在partition內是有序的,這個有序還需要其他機制的支援,後面會說到
另外,Kafka也可以作為儲存系統,因為Kafka跟其他的訊息佇列不一樣,Kafka的訊息是持久化到磁碟的,並且不是消費完就刪除。事實上往broker釋出一條訊息,broker僅僅持久化訊息,等到consumer主動發起pull,告訴broker一個offset,broker把offset對應的訊息返回給consumer。因此consumer是可以通過offset回溯消費。Kafka的效能在資料大小方面實際上是恆定的,所以可以長時間儲存資料。當然訊息在磁碟中會越來越多,可以設定只保留多久的訊息
生產者
producer比較好理解,和broker建立連線後,producer自己指定partition,把訊息推給broker就好了,並沒有什麼複雜的概念。
消費者和消費者組
上面提到,一個topic可以有多個consumer,我們的分散式系統都是有多臺例項,如果都訂閱了這個topic,豈不是重複消費了?因此Kafka有一個消費組的概念,訂閱的時候是以消費組為單位,一個partition只能被同個消費組下的一個消費者例項消費,但是一個消費者例項可以消費多個partition,這樣保證了在同一個消費組下不會重複消費
消費者例項可以是不同機器也可以是不同的程序,消費者建立Kafka連線時通過指定消費組名稱標記自己。一般我們就把一個分散式服務作為消費組,服務下的機器作為消費者例項
例如上圖有4個partition,消費組B有4個消費者例項,Kafka會負載均衡給每個例項指定一個分割槽。如果B組有五個例項,第五個例項是不會消費的,直到前四個例項有一個掛了。所以工作的消費者的例項數最多跟分割槽數一樣,所以設定分割槽數會影響我們Kafka的消費速率