小白這麼看kafka

​​       今天在網上看了半天關於kafka的介紹,還去了官網,但是非常遺憾,作爲小白,kafka到底怎麼設計的還是沒搞懂,而且感覺很多的博客都是大同小異的(懷疑是複製粘貼的),上來就介紹很多專業的名詞和概念,但是解釋的都不清楚(正經的書都不說人話)。但是看的多了還是“破解”一些門道,下面我不抄襲他們的寫法,把卡不卡的原理基礎用自己的理解寫一下。有個中文教程這麼寫的:

(地址:https://www.orchome.com/kafka/index

       我覺的小白能看懂,但是消息中間件遠不止這麼簡單(先搞懂簡單的.......)。

       按照套路,該解釋名詞了,但我不想直接解釋。先理解一下kafka是怎麼存消息的,假如現在生產者有個消息要存儲到kafka上,如果我是kafka,怎麼辦呢,我找了一個幫手,他叫zookeeper,他可以幫我找到一些人,提供一些地方,傳說中的服務器就是他們,叫Broker,萬事俱備,我開始存了,我非常聰明(假如),我先把消息分門別類,每個類都起個名字,這樣就不會找錯了,這個名字就叫主題吧,topic就是了,以後生產者找我存消息就告訴我存什麼主題我就知道往哪存了,而不是亂放,後來消息越來越多,一個主題裏的東西太多了,怎麼辦,我就想了個辦法,把主題做成了很多分區,partition,比如topic1的消息存儲在partition1和partition2兩個分區上,每個分區裏邊的消息也是按順序排好號碼存放的,1號消息,2號消息。。。,這樣,我通過找到topic在找到那個partition在找到哪個號碼就非常準確的找到消息了,而且我還擴展了topic的容量,還保證了順序,真好。

        這些消息都是存在broker上的,broker上有很多partition,partition1,partition2,partition3.。。。,突然有一天,broker放不下了,太多了,沒辦法,又拜託zookeeper找來了一個broker2,兩個broker一起幫我存消息,這樣就叫集羣了(做集羣還有其他的考慮,高可用,負載均衡什麼的,但我認爲,放不下可能是kafka做集羣的最初動機),有了兩個broker,以後存消息就不能亂放了,我先指定了一個分配策略,將這些partition均勻的分給兩個broker,總不能一個累死一個閒死吧。這樣,我就可以通過擴展broker來存更多的消息了。

        消息都是從哪來的?有一羣叫producer的給我的,由於我存儲的方法如上,我要求他們必須要告訴我主題topic是啥,我才能知道存到哪裏,如果他們知道partition就可以指定存到哪個分區中了,但是很多時候他們不知道,所以我給了另一個方案,讓他們提供一個key,我根據key做hash算法就能找到partion了,如果key一樣,我就總能找到那個partition。

到這裏,大部分名詞就解釋完畢了,producer(生產者),broker(服務器),topic(主題),partition(分區),就是這麼簡單,小白就是這麼理解的。

       還要說一下我的顧客,就是消費者consumer,那我怎麼把消息給消費者呢,我提供了兩種方法,1:隊列,2:發佈訂閱。其實我並沒有設置一個開關什麼的,是發佈訂閱還是隊列,其實我只有一種方式,就是把消息發送給所有的consumer group。

但是我有個規定,就是規定一個消息只能在consumer組選一個出來消費。這就比如,我要發給一個組100塊錢的獎勵,只能由一個人來領,不能撕成好幾張分給他們。但是我可以每個組都給100塊錢。所以會有這樣兩種情況發生,1,只有一個組,我的消息會被這個組瓜分,但是每個消息只能由這個組裏的一個人消費,這種情況就叫隊列模式。2,這個組的人很聰明,他們知道我會給每個組錢,所以這個組的人每個人都假裝是一個組,也就是每個consumer 都是不同的組,那我只能把消息發給他們每一個人,這就是發佈訂閱模式。

        呵呵我有那麼好騙嗎?當然不是,每個都假裝一個組來要錢,我就把錢往桌上一摔,他們就搶啊,一下就亂套了。所以多個consumer並行消費無法保證消息的順序消費。但是上面說到partition裏是按照號碼排好的有序消息,所以如果只有一個組來消費的話,消費單個partition就是有序的,也就是說一個分區只屬於一個組裏的一個consumer,但是一個topic有很多分區,那麼一個consumer是可以消費多個分區的,那麼多個consumer消費多個partition也是不衝突的。其實設置分區恰恰提高了消費效率,設置多個consumer來消費同一個toic,因爲分區的存在,就可以同時(並行)消費這個主題的好幾個消息了。這裏很亂可以看網上的博文,有很多,小白就不參與理解了。

        還有很多的知識可以寫,比如分區也可以自我複製,還有leader(領導)和follower(隨從),他們組成了一個ISR,follower不聽話還會被踢出ISR。還有offset(也就是消息的號碼)是怎樣維護的,據說存在了一個名爲 __consumer_offsets 的Topic中。好了,到這裏kafka的消息發佈存儲消費的基本原理就解釋完了,這是很粗俗簡單的(不保證嚴謹),但是有助於理解,還在學習中。。。打字打得手疼,不寫了(*^▽^*)。​​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章