1. 程式人生 > >kafka生產、存儲、消費消息

kafka生產、存儲、消費消息

消息隊列 保存 publish pen 想象 追加 app ima 其中

技術分享圖片

Kafka架構組成:
由producer(消息生產者)、
consumer(消息消費者)、
borker(kafka集群的server,負責處理消息讀、寫請求,存儲消息,在kafka cluster這一層這裏,其實裏面是有很多個broker)、
topic(消息隊列/分類相當於隊列,裏面有生產者和消費者模型)、
zookeeper(元數據信息存在zookeeper中,包括:存儲消費偏移量,topic話題信息,partition信息) 這些部分組成。

kafka裏面的消息是有topic來組織的,簡單的我們可以想象為一個隊列,一個隊列就是一個topic,然後它把每個topic又分為很多個partition(真實存數據的地方,可以理解成一個文件,有多少個partition是可以指定的),這個是為了做並行的,
在每個partition內部消息強有序(在一個partition內是嚴格的先進先出的原則,但是在一個topic中不是嚴格FIFO,把一個topic設成一個partition就是嚴格FIFo),相當於有序的隊列,其中每個消息都有個序號offset,比如0到12,從前面讀往後面寫。一個partition對應一個broker,一個broker可以管多個partition,比如說,topic有6個partition,有兩個broker,那每個broker就管3個partition。這個partition可以很簡單想象為一個文件,當數據發過來的時候它就往這個partition上面append,追加就行,消息不經過內存緩沖,直接寫入文件,
kafka和很多消息系統不一樣,很多消息系統是消費完了我就把它刪掉,而kafka是根據時間策略刪除,而不是消費完就刪除(默認保存一周),在kafka裏面沒有一個消費完這麽個概念,只有過期這樣一個概念。
producer自己決定往哪個partition裏面去寫,這裏有一些的策略,譬如如果hash(易產生數據傾斜)或者輪詢(負載均衡),不用多個partition之間去join數據了。
consumer自己維護消費到哪個offset(即:自己去zookeeper中更新數據),
每個consumer都有對應的group,group內是queue消費模型(各個consumer消費不同的partition,因此一個消息在group內只消費一次,組內:一個consumer一次只能連接一個partition,不能再有其他consumer連接partition),
group間是publish-subscribe消費模型,各個group各自獨立消費,互不影響,因此一個消息在被每個group消費一次。

技術分享圖片技術分享圖片

kafka生產、存儲、消費消息