實(shí)時(shí)數(shù)據(jù)處理,從名字上看,很好理解,就是將數(shù)據(jù)進(jìn)行實(shí)時(shí)處理,在現(xiàn)在流行的微服務(wù)開發(fā)中,最常用實(shí)時(shí)數(shù)據(jù)處理平臺(tái)有 RabbitMQ、RocketMQ 等消息中間件。
這些中間件,最大的特點(diǎn)主要有兩個(gè):
-
服務(wù)解耦
-
流量削峰
在早期的 web 應(yīng)用程序開發(fā)中,當(dāng)請求量突然上來了時(shí)候,我們會(huì)將要處理的數(shù)據(jù)推送到一個(gè)隊(duì)列通道中,然后另起一個(gè)線程來不斷輪訓(xùn)拉取隊(duì)列中的數(shù)據(jù),從而加快程序的運(yùn)行效率。
但是隨著請求量不斷的增大,并且隊(duì)列通道的數(shù)據(jù)一致處于高負(fù)載,在這種情況下,應(yīng)用程序的內(nèi)存占用率會(huì)非常高,稍有不慎,會(huì)出現(xiàn)內(nèi)存不足,造成程序內(nèi)存溢出,從而導(dǎo)致服務(wù)不可用。
隨著業(yè)務(wù)量的不斷擴(kuò)張,在一個(gè)應(yīng)用程序內(nèi),使用這種模式已然無法滿足需求,因此之后,就誕生了各種消息中間件,例如 ActiveMQ、RabbitMQ、RocketMQ等中間件。
采用這種模型,本質(zhì)就是將要推送的數(shù)據(jù),不在存放在當(dāng)前應(yīng)用程序的內(nèi)存中,而是將數(shù)據(jù)存放到另一個(gè)專門負(fù)責(zé)數(shù)據(jù)處理的應(yīng)用程序中,從而實(shí)現(xiàn)服務(wù)解耦。
消息中間件:主要的職責(zé)就是保證能接受到消息,并將消息存儲(chǔ)到磁盤,即使其他服務(wù)都掛了,數(shù)據(jù)也不會(huì)丟失,同時(shí)還可以對數(shù)據(jù)消費(fèi)情況做好監(jiān)控工作。
應(yīng)用程序:只需要將消息推送到消息中間件,然后啟用一個(gè)線程來不斷從消息中間件中拉取數(shù)據(jù),進(jìn)行消費(fèi)確認(rèn)即可!
引入消息中間件之后,整個(gè)服務(wù)開發(fā)會(huì)變得更加簡單,各負(fù)其責(zé)。
Kafka 本質(zhì)其實(shí)也是消息中間件的一種,Kafka 出自于 LinkedIn 公司,與 2010 年開源到 github。
LinkedIn 的開發(fā)團(tuán)隊(duì),為了解決數(shù)據(jù)管道問題,起初采用了 ActiveMQ 來進(jìn)行數(shù)據(jù)交換,大約是在 2010 年前后,那時(shí)的 ActiveMQ 還遠(yuǎn)遠(yuǎn)無法滿足 LinkedIn 對數(shù)據(jù)傳遞系統(tǒng)的要求,經(jīng)常由于各種缺陷而導(dǎo)致消息阻塞或者服務(wù)無法正常訪問,為了能夠解決這個(gè)問題,LinkedIn 決定研發(fā)自己的消息傳遞系統(tǒng),Kafka 由此誕生。
在 LinkedIn 公司,Kafka 可以有效地處理每天數(shù)十億條消息的指標(biāo)和用戶活動(dòng)跟蹤,其強(qiáng)大的處理能力,已經(jīng)被業(yè)界所認(rèn)可,并成為大數(shù)據(jù)流水線的首選技術(shù)。
二、架構(gòu)介紹
======
先來看一張圖,下面這張圖就是 kafka 生產(chǎn)與消費(fèi)的核心架構(gòu)模型!
如果你看不懂這些概念沒關(guān)系,我會(huì)帶著大家一起梳理一遍!
-
Producer:Producer 即生產(chǎn)者,消息的產(chǎn)生者,是消息的入口
-
Broker:Broker 是 kafka 一個(gè)實(shí)例,每個(gè)服務(wù)器上有一個(gè)或多個(gè) kafka 的實(shí)例,簡單的理解就是一臺(tái) kafka 服務(wù)器,kafka cluster表示集群的意思
-
Topic:消息的主題,可以理解為消息隊(duì)列,kafka的數(shù)據(jù)就保存在topic。在每個(gè) broker 上都可以創(chuàng)建多個(gè) topic 。
-
Partition:Topic的分區(qū),每個(gè) topic 可以有多個(gè)分區(qū),分區(qū)的作用是做負(fù)載,提高 kafka 的吞吐量。同一個(gè) topic 在不同的分區(qū)的數(shù)據(jù)是不重復(fù)的,partition 的表現(xiàn)形式就是一個(gè)一個(gè)的文件夾!
-
Replication:每一個(gè)分區(qū)都有多個(gè)副本,副本的作用是做備胎,主分區(qū)(Leader)會(huì)將數(shù)據(jù)同步到從分區(qū)(Follower)。當(dāng)主分區(qū)(Leader)故障的時(shí)候會(huì)選擇一個(gè)備胎(Follower)上位,成為 Leader。在kafka中默認(rèn)副本的最大數(shù)量是10個(gè),且副本的數(shù)量不能大于Broker的數(shù)量,follower和leader絕對是在不同的機(jī)器,同一機(jī)器對同一個(gè)分區(qū)也只可能存放一個(gè)副本
-
Message:每一條發(fā)送的消息主體。
-
Consumer:消費(fèi)者,即消息的消費(fèi)方,是消息的出口。
-
Consumer Group:我們可以將多個(gè)消費(fèi)組組成一個(gè)消費(fèi)者組,在 kafka 的設(shè)計(jì)中同一個(gè)分區(qū)的數(shù)據(jù)只能被消費(fèi)者組中的某一個(gè)消費(fèi)者消費(fèi)。同一個(gè)消費(fèi)者組的消費(fèi)者可以消費(fèi)同一個(gè)topic的不同分區(qū)的數(shù)據(jù),這也是為了提高kafka的吞吐量!
-
Zookeeper:kafka 集群依賴 zookeeper 來保存集群的的元信息,來保證系統(tǒng)的可用性。
簡而言之,kafka 本質(zhì)就是一個(gè)消息系統(tǒng),與大多數(shù)的消息系統(tǒng)一樣,主要的特點(diǎn)如下:
-
使用推拉模型將生產(chǎn)者和消費(fèi)者分離
-
為消息傳遞系統(tǒng)中的消息數(shù)據(jù)提供持久性,以允許多個(gè)消費(fèi)者
-
提供高可用集群服務(wù),主從模式,同時(shí)支持橫向水平擴(kuò)展
與 ActiveMQ、RabbitMQ、RocketMQ 不同的地方在于,它有一個(gè)**分區(qū)Partition**的概念。
這個(gè)分區(qū)的意思就是說,如果你創(chuàng)建的topic有5個(gè)分區(qū),當(dāng)你一次性向 kafka 中推 1000 條數(shù)據(jù)時(shí),這 1000 條數(shù)據(jù)默認(rèn)會(huì)分配到 5 個(gè)分區(qū)中,其中每個(gè)分區(qū)存儲(chǔ) 200 條數(shù)據(jù)。
這樣做的目的,就是方便消費(fèi)者從不同的分區(qū)拉取數(shù)據(jù),假如你啟動(dòng) 5 個(gè)線程同時(shí)拉取數(shù)據(jù),每個(gè)線程拉取一個(gè)分區(qū),消費(fèi)速度會(huì)非常非常快!
這是 kafka 與其他的消息系統(tǒng)最大的不同!
2.1、發(fā)送數(shù)據(jù)
========
和其他的中間件一樣,kafka 每次發(fā)送數(shù)據(jù)都是向Leader分區(qū)發(fā)送數(shù)據(jù),并順序?qū)懭氲酱疟P,然后Leader分區(qū)會(huì)將數(shù)據(jù)同步到各個(gè)從分區(qū)Follower,即使主分區(qū)掛了,也不會(huì)影響服務(wù)的正常運(yùn)行。
那 kafka 是如何將數(shù)據(jù)寫入到對應(yīng)的分區(qū)呢?kafka中有以下幾個(gè)原則:
-
1、數(shù)據(jù)在寫入的時(shí)候可以指定需要寫入的分區(qū),如果有指定,則寫入對應(yīng)的分區(qū)
-
2、如果沒有指定分區(qū),但是設(shè)置了數(shù)據(jù)的key,則會(huì)根據(jù)key的值hash出一個(gè)分區(qū)
-
3、如果既沒指定分區(qū),又沒有設(shè)置key,則會(huì)輪詢選出一個(gè)分區(qū)
2.2、消費(fèi)數(shù)據(jù)
========
與生產(chǎn)者一樣,消費(fèi)者主動(dòng)的去kafka集群拉取消息時(shí),也是從Leader分區(qū)去拉取數(shù)據(jù)。
這里我們需要重點(diǎn)了解一個(gè)名詞:消費(fèi)組!
考慮到多個(gè)消費(fèi)者的場景,kafka 在設(shè)計(jì)的時(shí)候,可以由多個(gè)消費(fèi)者組成一個(gè)消費(fèi)組,同一個(gè)消費(fèi)組者的消費(fèi)者可以消費(fèi)同一個(gè) topic 下不同分區(qū)的數(shù)據(jù),同一個(gè)分區(qū)只會(huì)被一個(gè)消費(fèi)組內(nèi)的某個(gè)消費(fèi)者所消費(fèi),防止出現(xiàn)重復(fù)消費(fèi)的問題!
但是不同的組,可以消費(fèi)同一個(gè)分區(qū)的數(shù)據(jù)!
你可以這樣理解,一個(gè)消費(fèi)組就是一個(gè)客戶端,一個(gè)客戶端可以由很多個(gè)消費(fèi)者組成,以便加快消息的消費(fèi)能力。
但是,如果一個(gè)組下的消費(fèi)者數(shù)量大于分區(qū)數(shù)量,就會(huì)出現(xiàn)很多的消費(fèi)者閑置。
如果分區(qū)數(shù)量大于一個(gè)組下的消費(fèi)者數(shù)量,會(huì)出現(xiàn)一個(gè)消費(fèi)者負(fù)責(zé)多個(gè)分區(qū)的消費(fèi),會(huì)出現(xiàn)消費(fèi)性能不均衡的情況。
因此,在實(shí)際的應(yīng)用中,建議消費(fèi)者組的consumer的數(shù)量與partition的數(shù)量保持一致!
三、kafka 安裝
==========
光說理論可沒用,下面我們就以 centos7 為例,介紹一下 kafka 的安裝和使用。
kafka 需要 zookeeper 來保存服務(wù)實(shí)例的元信息,因此在安裝 kafka 之前,我們需要先安裝 zookeeper。
3.1、安裝zookeeper
===============
zookeeper 安裝環(huán)境依賴于 jdk,因此我們需要事先安裝 jdk
#?安裝jdk1.8
yum?-y?install?java-1.8.0-openjdk
下載zookeeper,并解壓文件包
#在線下載zookeeper
wget?http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
#解壓
tar?-zxvf?zookeeper-3.4.12.tar.gz
創(chuàng)建數(shù)據(jù)、日志目錄
#創(chuàng)建數(shù)據(jù)和日志存放目錄
cd?/usr/zookeeper/
mkdir?data
mkdir?log
#把conf下的zoo_sample.cfg備份一份,然后重命名為zoo.cfg
cd?conf/
cp?zoo_sample.cfg?zoo.cfg
配置zookeeper
#編輯zoo.cfg文件
vim?zoo.cfg
重新配置dataDir和dataLogDir的存儲(chǔ)路徑
最后,啟動(dòng) Zookeeper 服務(wù)
#進(jìn)入Zookeeper的bin目錄
cd?zookeeper/zookeeper-3.4.12/bin
#啟動(dòng)Zookeeper
./zkServer.sh?start
#查詢Zookeeper狀態(tài)
./zkServer.sh?status
#關(guān)閉Zookeeper狀態(tài)
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)Java工程師,想要提升技能,往往是自己摸索成長或者是報(bào)班學(xué)習(xí),但對于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Java開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Java開發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且會(huì)持續(xù)更新!
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲取?。。▊渥ava獲?。?/strong>

復(fù)習(xí)的面試資料
這些面試全部出自大廠面試真題和面試合集當(dāng)中,小編已經(jīng)為大家整理完畢(PDF版)
- 第一部分:Java基礎(chǔ)-中級-高級
- 第二部分:開源框架(SSM:Spring+SpringMVC+MyBatis)
- 第三部分:性能調(diào)優(yōu)(JVM+MySQL+Tomcat)
- 第四部分:分布式(限流:ZK+Nginx;緩存:Redis+MongoDB+Memcached;通訊:MQ+kafka)
- 第五部分:微服務(wù)(SpringBoot+SpringCloud+Dubbo)
- 第六部分:其他:并發(fā)編程+設(shè)計(jì)模式+數(shù)據(jù)結(jié)構(gòu)與算法+網(wǎng)絡(luò)
進(jìn)階學(xué)習(xí)筆記pdf
- Java架構(gòu)進(jìn)階之架構(gòu)筑基篇(Java基礎(chǔ)+并發(fā)編程+JVM+MySQL+Tomcat+網(wǎng)絡(luò)+數(shù)據(jù)結(jié)構(gòu)與算法)
- Java架構(gòu)進(jìn)階之開源框架篇(設(shè)計(jì)模式+Spring+SpringMVC+MyBatis)
- Java架構(gòu)進(jìn)階之分布式架構(gòu)篇 (限流(ZK/Nginx)+緩存(Redis/MongoDB/Memcached)+通訊(MQ/kafka))
- Java架構(gòu)進(jìn)階之微服務(wù)架構(gòu)篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
《互聯(lián)網(wǎng)大廠面試真題解析、進(jìn)階開發(fā)核心學(xué)習(xí)筆記、全套講解視頻、實(shí)戰(zhàn)項(xiàng)目源碼講義》點(diǎn)擊傳送門即可獲??!
*
[外鏈圖片轉(zhuǎn)存中…(img-I5Z78K9C-1712558670720)]
[外鏈圖片轉(zhuǎn)存中…(img-gvVN29n9-1712558670721)]
[外鏈圖片轉(zhuǎn)存中…(img-JFiefJnC-1712558670721)]
- Java架構(gòu)進(jìn)階之微服務(wù)架構(gòu)篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
[外鏈圖片轉(zhuǎn)存中…(img-cvqF6ofU-1712558670721)]
[外鏈圖片轉(zhuǎn)存中…(img-ZYl9qdL8-1712558670721)]文章來源:http://www.zghlxwxcb.cn/news/detail-853650.html
《互聯(lián)網(wǎng)大廠面試真題解析、進(jìn)階開發(fā)核心學(xué)習(xí)筆記、全套講解視頻、實(shí)戰(zhàn)項(xiàng)目源碼講義》點(diǎn)擊傳送門即可獲??!文章來源地址http://www.zghlxwxcb.cn/news/detail-853650.html
到了這里,關(guān)于3分鐘帶你徹底搞懂 Kafka的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!