Kafka學習(1)——kafka綜述

在公司做數(shù)據(jù)推送時,開始接觸kafka。由于那一套kafka數(shù)據(jù)推送的框架并不是筆者本人搭建的,因此只是停留在淺顯的使用上。

學技術就是這樣,不會、沒見過、看不懂,官方英文文檔就像婆娘的裹腳布又臭又長等等,這些困難都別怕。技術就像一個工具,先淺顯的用,用的大致熟了,再去了解這個工具,等深入了解了,再去總結歸納這個工具,最后有能力者,改進這個工具。

本次關于kafka學習的筆記,將分為四個部分進行:

  1. kafka綜述:簡要歸納kafka是什么
  2. 本地運行:從github上把kafka項目拉下來,本地命令行運行
  3. Kafka Manager: github上開源的kafka管理工具,為kafka消息的發(fā)送接收提供可視化操作界面
  4. write demo:寫自己的producerconsumer,并簡單地應用kafka

kafka是什么呢?

kafka是一個分布式、可分區(qū)的消息系統(tǒng)。之前看過一篇博客,比喻的很好。發(fā)消息的系統(tǒng)是生產(chǎn)者(producer),而接收消息的系統(tǒng)是消費者(consumer),如果把消息比喻為雞蛋,那么生產(chǎn)者就是母雞,而消費者可以理解為吃雞蛋的人。母雞下一個蛋,人就吃一個蛋,很和諧。如果人吃雞蛋的時候噎住了(系統(tǒng)宕機了),那母雞后面下的蛋就會丟失(數(shù)據(jù)丟失了),而如果母雞下蛋速度超過人吃雞蛋的速度,那人就會吃不消,消息就會堵塞,導致系統(tǒng)超時,雞蛋又會丟失。這個時候就需要一個籃子,把雞蛋周轉一下。kafka就是這樣一個籃子。

好吧,具體先根據(jù)我自己在做的業(yè)務來分析吧?!皵?shù)據(jù)推送”是企業(yè)級應用比較常見一個功能,將數(shù)據(jù)從一個系統(tǒng)中推送到另一個系統(tǒng)中,可以用spring 的Integration來實現(xiàn),而應用kafka是一個更好的解決方案。

我們把要推送數(shù)據(jù)的主鍵(id)、操作類型(update、delete等)、關鍵字(key:表示是哪個實體對應的數(shù)據(jù))封裝為一個model,把這個model當做消息發(fā)送給kafka,而消費者從kafka主動pull這個model,消費者拿到model后,解析它,并根據(jù)解析的model直接、主動從生產(chǎn)者那兒讀取所要推送的數(shù)據(jù)。

這樣做的好處顯而易見,生產(chǎn)者那邊推送會非常快,因為只需要推送一個model即可,用戶就可以去做其他事情了。此外,要推送的數(shù)據(jù)也不會丟失,因為消息(model)被安全的保存在kafka中,如果消費者沒有成功保存數(shù)據(jù),那么再去讀這個消息即可。這得益于kafka的優(yōu)良設計。

kafka名詞解釋
  • producer 生產(chǎn)者,主動發(fā)消息的系統(tǒng)(下蛋的母雞)
  • consumer 消費者,主動向kafka讀消息的系統(tǒng)(吃蛋的人)
  • topic 主題,可以理解為向雞蛋上貼一個標簽,吃蛋的人不是每個雞蛋都吃,它只吃某個topic的雞蛋。
    -broker可以理解為籃子
  • partition 分區(qū),kafka對于一個topic會有多個分區(qū)去保存消息。
  • offset偏移量,是一個整數(shù),就像指針,這個偏移量是消費者去控制的,偏移量指著幾,就去讀分區(qū)上的對應數(shù)字的消息。一個分區(qū)、一個消費者對應一個offset。
一個topic有多個分區(qū),這里有三個,每個分區(qū)存儲很多消息

分區(qū)可以處理更多的消息,不受單臺服務器的限制;分區(qū)可以作為并行處理的單元

kafka 分布式(Distribution)

一個topic的分區(qū)被分布到集群中的多個服務器上。每個服務器處理它分到的分區(qū)。 根據(jù)配置每個分區(qū)還可以復制到其它服務器作為備份容錯。 每個分區(qū)有一個leader,零或多個follower。Leader處理此分區(qū)的所有的讀寫請求,而follower被動的復制數(shù)據(jù)。如果leader宕機,其它的一個follower會被推舉為新的leader。 一臺服務器可能同時是一個分區(qū)的leader,另一個分區(qū)的follower。 這樣可以平衡負載,避免所有的請求都只讓一臺或者某幾臺服務器處理。

生產(chǎn)者往某個Topic上發(fā)布消息。生產(chǎn)者也負責選擇發(fā)布到Topic上的哪一個分區(qū)。最簡單的方式從分區(qū)列表中輪流選擇。也可以根據(jù)某種算法依照權重選擇分區(qū)。開發(fā)者負責如何選擇分區(qū)的算法。

通常來講,消息模型可以分為兩種, 隊列和發(fā)布-訂閱式。 隊列的處理方式是 一組消費者從服務器讀取消息,一條消息只有其中的一個消費者來處理。在發(fā)布-訂閱模型中,消息被廣播給所有的消費者,接收到消息的消費者都可以處理此消息。Kafka為這兩種模型提供了單一的消費者抽象模型: 消費者組 (consumer group)。 消費者用一個消費者組名標記自己。 一個發(fā)布在Topic上消息被分發(fā)給此消費者組中的一個消費者。 假如所有的消費者都在一個組中,那么這就變成了queue模型。 假如所有的消費者都在不同的組中,那么就完全變成了發(fā)布-訂閱模型。 更通用的, 我們可以創(chuàng)建一些消費者組作為邏輯上的訂閱者。每個組包含數(shù)目不等的消費者, 一個組內多個消費者可以用來擴展性能和容錯。正如下圖所示:

一個集群包含兩個server,每個server包含兩個分區(qū);兩個消費者組

通過并行topic的parition —— kafka提供了順序保證和負載均衡。每個partition僅由同一個消費者組中的一個消費者消費到。并確保消費者是該partition的唯一消費者,并按順序消費數(shù)據(jù)。每個topic有多個分區(qū),則需要對多個消費者做負載均衡,但請注意,相同的消費者組中不能有比分區(qū)更多的消費者,否則多出的消費者一直處于空等待,不會收到消息。

也就是說,在一個消費者組中,消費者與分區(qū)是一對多的關系。

關于kafka更多的信息,請參見這里。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評論 19 139
  • Kafka入門經(jīng)典教程-Kafka-about云開發(fā) http://www.aboutyun.com/threa...
    葡萄喃喃囈語閱讀 10,987評論 4 54
  • Kafka官網(wǎng):http://kafka.apache.org/入門1.1 介紹Kafka? 是一個分布式流處理系...
    it_zzy閱讀 4,013評論 3 53
  • kafka的定義:是一個分布式消息系統(tǒng),由LinkedIn使用Scala編寫,用作LinkedIn的活動流(Act...
    時待吾閱讀 5,541評論 1 15
  • 項目4月份發(fā)版,直接需要整合kafka,今天開始學,一個月內完成kafka的部分。 資料來源:http://www...
    MisterCH閱讀 1,834評論 0 4

友情鏈接更多精彩內容