日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

作者: JAVA3y 來自:Java3y

前言

只有光頭才能變強。

文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y

在這篇之前已經(jīng)寫過兩篇基礎(chǔ)文章了,強烈建議先去閱讀:

  • 什么是ZooKeeper?
  • 什么是消息隊列?

眾所周知,消息隊列的產(chǎn)品有好幾種,這里我選擇學(xué)習(xí)Kafka的原因,無他,公司在用。

我司使用的是Kafka和自研的消息隊列(Kafka和RocketMQ)改版,于是我就想學(xué)學(xué)Kafka這款消息隊列啦。本篇文章對Kafka入門,希望對大家有所幫助。

本文知識點提前預(yù)覽:

全網(wǎng)最通俗易懂的Kafka入門

提前預(yù)覽

這篇文章花了我很長時間畫圖,目的是希望以最通俗易懂的方式帶大家入門,如果覺得不錯,希望能給我點個贊

一、什么是Kafka?

首先我們得去官網(wǎng)看看是怎么介紹Kafka的:

  • https://kafka.Apache.org/intro

在收集資料學(xué)習(xí)的時候,已經(jīng)發(fā)現(xiàn)有不少的前輩對官網(wǎng)的介紹進行翻譯和總結(jié)了,所以我這里就不重復(fù)了,貼下地址大家自行去學(xué)習(xí)啦:

  • https://scala.cool/2018/03/learning-kafka-1/
  • https://colobu.com/2014/08/06/kafka-quickstart/

我之前寫過的消息隊列入門文章也提到了,要做一個消息隊列可能要考慮到以下的問題:

  • 使用消息隊列不可能是單機的(必然是分布式or集群)
  • 數(shù)據(jù)寫到消息隊列,可能會存在數(shù)據(jù)丟失問題,數(shù)據(jù)在消息隊列需要持久化(磁盤?數(shù)據(jù)庫?redis?分布式文件系統(tǒng)?)
  • 想要保證消息(數(shù)據(jù))是有序的,怎么做?
  • 為什么在消息隊列中重復(fù)消費了數(shù)據(jù)

下面我以Kafka為例對這些問題進行簡單的解答,進而入門Kafka。

1.1 Kafka入門

眾所周知,Kafka是一個消息隊列,把消息放到隊列里邊的叫生產(chǎn)者,從隊列里邊消費的叫消費者

全網(wǎng)最通俗易懂的Kafka入門

生產(chǎn)者和消費者

一個消息中間件,隊列不單單只有一個,我們往往會有多個隊列,而我們生產(chǎn)者和消費者就得知道:把數(shù)據(jù)丟給哪個隊列,從哪個隊列消息。我們需要給隊列取名字,叫做topic(相當于數(shù)據(jù)庫里邊的概念)

全網(wǎng)最通俗易懂的Kafka入門

給隊列取名字,專業(yè)名詞叫topic

現(xiàn)在我們給隊列取了名字以后,生產(chǎn)者就知道往哪個隊列丟數(shù)據(jù)了,消費者也知道往哪個隊列拿數(shù)據(jù)了。我們可以有多個生產(chǎn)者往同一個隊列(topic)丟數(shù)據(jù),多個消費者往同一個隊列(topic)拿數(shù)據(jù)

全網(wǎng)最通俗易懂的Kafka入門

為了提高一個隊列(topic)的吞吐量,Kafka會把topic進行分區(qū)(Partition)

全網(wǎng)最通俗易懂的Kafka入門

Kafka分區(qū)

所以,生產(chǎn)者實際上是往一個topic名為Java3y中的分區(qū)(Partition)丟數(shù)據(jù),消費者實際上是往一個topic名為Java3y的分區(qū)(Partition)取數(shù)據(jù)

全網(wǎng)最通俗易懂的Kafka入門

生產(chǎn)者和消費者實際上操作的是分區(qū)

一臺Kafka服務(wù)器叫做Broker,Kafka集群就是多臺Kafka服務(wù)器:

全網(wǎng)最通俗易懂的Kafka入門

Kafka集群

一個topic會分為多個partition,實際上partition會分布在不同的broker中,舉個例子:

全網(wǎng)最通俗易懂的Kafka入門

一個生產(chǎn)者丟數(shù)據(jù)給topic

由此得知:Kafka是天然分布式的

如果不了解分布式/集群,以及基本的分布式概念的同學(xué),可以關(guān)注我的GitHub:https://github.com/ZhongFuCheng3y/3y

關(guān)鍵字:分布式、SpringCloud 保證能讓你搞懂。覺得我寫得不錯,就給我點個贊

現(xiàn)在我們已經(jīng)知道了往topic里邊丟數(shù)據(jù),實際上這些數(shù)據(jù)會分到不同的partition上,這些partition存在不同的broker上。分布式肯定會帶來問題:“萬一其中一臺broker(Kafka服務(wù)器)出現(xiàn)網(wǎng)絡(luò)抖動或者掛了,怎么辦?”

Kafka是這樣做的:我們數(shù)據(jù)存在不同的partition上,那kafka就把這些partition做備份。比如,現(xiàn)在我們有三個partition,分別存在三臺broker上。每個partition都會備份,這些備份散落在不同的broker上。

全網(wǎng)最通俗易懂的Kafka入門

紅色代表主分區(qū),紫色代表備份分區(qū)

紅色塊的partition代表的是分區(qū),紫色的partition塊代表的是備份分區(qū)。生產(chǎn)者往topic丟數(shù)據(jù),是與分區(qū)交互,消費者消費topic的數(shù)據(jù),也是與主分區(qū)交互。

備份分區(qū)僅僅用作于備份,不做讀寫。如果某個Broker掛了,那就會選舉出其他Broker的partition來作為主分區(qū),這就實現(xiàn)了高可用

另外值得一提的是:當生產(chǎn)者把數(shù)據(jù)丟進topic時,我們知道是寫在partition上的,那partition是怎么將其持久化的呢?(不持久化如果Broker中途掛了,那肯定會丟數(shù)據(jù)嘛)。

Kafka是將partition的數(shù)據(jù)寫在磁盤的(消息日志),不過Kafka只允許追加寫入(順序訪問),避免緩慢的隨機 I/O 操作。

  • Kafka也不是partition一有數(shù)據(jù)就立馬將數(shù)據(jù)寫到磁盤上,它會先緩存一部分,等到足夠多數(shù)據(jù)量或等待一定的時間再批量寫入(flush)。

上面balabala地都是講生產(chǎn)者把數(shù)據(jù)丟進topic是怎么樣的,下面來講講消費者是怎么消費的。既然數(shù)據(jù)是保存在partition中的,那么消費者實際上也是從partition中取數(shù)據(jù)。

全網(wǎng)最通俗易懂的Kafka入門

從各個主分區(qū)取數(shù)據(jù)

生產(chǎn)者可以有多個,消費者也可以有多個。像上面圖的情況,是一個消費者消費三個分區(qū)的數(shù)據(jù)。多個消費者可以組成一個消費者組

全網(wǎng)最通俗易懂的Kafka入門

消費者組

本來是一個消費者消費三個分區(qū)的,現(xiàn)在我們有消費者組,就可以每個消費者去消費一個分區(qū)(也是為了提高吞吐量)

全網(wǎng)最通俗易懂的Kafka入門

消費者組的每個消費者會去對應(yīng)partition拿數(shù)據(jù)

按圖上所示的情況,這里想要說明的是:

  • 如果消費者組中的某個消費者掛了,那么其中一個消費者可能就要消費兩個partition了
  • 如果只有三個partition,而消費者組有4個消費者,那么一個消費者會空閑
  • 如果多加入一個消費者組,無論是新增的消費者組還是原本的消費者組,都能消費topic的全部數(shù)據(jù)。(消費者組之間從邏輯上它們是獨立的)

前面講解到了生產(chǎn)者往topic里丟數(shù)據(jù)是存在partition上的,而partition持久化到磁盤是IO順序訪問的,并且是先寫緩存,隔一段時間或者數(shù)據(jù)量足夠大的時候才批量寫入磁盤的。

消費者在讀的時候也很有講究:正常的讀磁盤數(shù)據(jù)是需要將內(nèi)核態(tài)數(shù)據(jù)拷貝到用戶態(tài)的,而Kafka 通過調(diào)用sendfile()直接從內(nèi)核空間(DMA的)到內(nèi)核空間(Socket的),少做了一步拷貝的操作。

全網(wǎng)最通俗易懂的Kafka入門

Kafka 讀數(shù)據(jù) 巧妙

有的同學(xué)可能會產(chǎn)生疑問:消費者是怎么知道自己消費到哪里的呀?Kafka不是支持回溯嗎?那是怎么做的呀?

  • 比如上面也提到:如果一個消費者組中的某個消費者掛了,那掛掉的消費者所消費的分區(qū)可能就由存活的消費者消費。那存活的消費者是需要知道掛掉的消費者消費到哪了,不然怎么玩。

這里要引出offset了,Kafka就是用offset來表示消費者的消費進度到哪了,每個消費者會都有自己的offset。說白了offset就是表示消費者的消費進度

在以前版本的Kafka,這個offset是由Zookeeper來管理的,后來Kafka開發(fā)者認為Zookeeper不合適大量的刪改操作,于是把offset在broker以內(nèi)部topic(__consumer_offsets)的方式來保存起來。

每次消費者消費的時候,都會提交這個offset,Kafka可以讓你選擇是自動提交還是手動提交。

既然提到了Zookeeper,那就多說一句。Zookeeper雖然在新版的Kafka中沒有用作于保存客戶端的offset,但是Zookeeper是Kafka一個重要的依賴。

  • 探測broker和consumer的添加或移除。
  • 負責(zé)維護所有partition的領(lǐng)導(dǎo)者/從屬者關(guān)系(主分區(qū)和備份分區(qū)),如果主分區(qū)掛了,需要選舉出備份分區(qū)作為主分區(qū)。
  • 維護topic、partition等元配置信息
  • ….
全網(wǎng)最通俗易懂的Kafka入門

這張圖來源胡夕老師的《Kafka核心技術(shù)與實戰(zhàn)》

最后

通過這篇文章,文章開頭那幾個問題估計多多少少都懂一些啦。我來簡要回答一下:

使用消息隊列不可能是單機的(必然是分布式or集群)

Kafka天然是分布式的,往一個topic丟數(shù)據(jù),實際上就是往多個broker的partition存儲數(shù)據(jù)

數(shù)據(jù)寫到消息隊列,可能會存在數(shù)據(jù)丟失問題,數(shù)據(jù)在消息隊列需要持久化(磁盤?數(shù)據(jù)庫?Redis?分布式文件系統(tǒng)?)

Kafka會將partition以消息日志的方式(落磁盤)存儲起來,通過 順序訪問IO和緩存(等到一定的量或時間)才真正把數(shù)據(jù)寫到磁盤上,來提高速度。

想要保證消息(數(shù)據(jù))是有序的,怎么做?

Kafka會將數(shù)據(jù)寫到partition,單個partition的寫入是有順序的。如果要保證全局有序,那只能寫入一個partition中。如果要消費也有序,消費者也只能有一個。

為什么在消息隊列中重復(fù)消費了數(shù)據(jù)

凡是分布式就無法避免網(wǎng)絡(luò)抖動/機器宕機等問題的發(fā)生,很有可能消費者A讀取了數(shù)據(jù),還沒來得及消費,就掛掉了。Zookeeper發(fā)現(xiàn)消費者A掛了,讓消費者B去消費原本消費者A的分區(qū),等消費者A重連的時候,發(fā)現(xiàn)已經(jīng)重復(fù)消費同一條數(shù)據(jù)了。(各種各樣的情況,消費者超時等等都有可能…)

如果業(yè)務(wù)上不允許重復(fù)消費的問題,最好消費者那端做業(yè)務(wù)上的校驗(如果已經(jīng)消費過了,就不消費了)


這篇文章主要是Kafka入門,Kafka還涉及到別的概念,以及還有別的東西。在我感覺中,很多的面試題都跟配置有關(guān),所以在解決某些問題的時候,先看看能不能通過現(xiàn)有配置解決掉(學(xué)多了框架,你就會發(fā)現(xiàn)很多官方的就已經(jīng)支持解決了,你做的可能改改配置/參數(shù)就完事了)。

分享到:
標簽:Kafka
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定