RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Kafka 的簡介

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-07-03 11:10 ? 次閱讀

1 kafka簡介

2 為什么要用消息系統(tǒng)

3 kafka基礎(chǔ)知識

4 kafka集群架構(gòu)

5 總結(jié)

5080c866-1942-11ee-962d-dac502259ad0.png

1 kafka簡介

其主要設(shè)計目標(biāo)如下:

以時間復(fù)雜度為O(1)的方式提供消息持久化能力,即使對TB級以上數(shù)據(jù)也能保證常數(shù)時間的訪問性能

高吞吐率。即使在非常廉價的機(jī)器上也能做到單機(jī)支持每秒100K條消息的傳輸

支持Kafka Server間的消息分區(qū),及分布式消費,同時保證每個partition內(nèi)的消息順序傳輸,同時支持離線數(shù)據(jù)處理和實時數(shù)據(jù)處理

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

2 為什么要用消息系統(tǒng)

Kafka 本質(zhì)上是一個 MQ(Message Queue),使用消息隊列的好處?

解耦:允許我們獨立修改隊列兩邊的處理過程而互不影響。

冗余:有些情況下,我們在處理數(shù)據(jù)的過程會失敗造成數(shù)據(jù)丟失。消息隊列把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險, 確保你的數(shù)據(jù)被安全的保存直到你使用完畢

峰值處理能力:不會因為突發(fā)的流量請求導(dǎo)致系統(tǒng)崩潰,消息隊列能夠使服務(wù)頂住突發(fā)的訪問壓力, 有助于解決生產(chǎn)消息和消費消息的處理速度不一致的情況

異步通信:消息隊列允許用戶把消息放入隊列但不立即處理它, 等待后續(xù)進(jìn)行消費處理。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/


3 kafka基礎(chǔ)知識

下面給出 Kafka 一些重要概念,讓大家對 Kafka 有個整體的認(rèn)識和感知

Producer:即消息生產(chǎn)者,向 Kafka Broker 發(fā)消息的客戶端。

Consumer:即消息消費者,從 Kafka Broker 讀消息的客戶端。

Consumer Group:即消費者組,消費者組內(nèi)每個消費者負(fù)責(zé)消費不同分區(qū)的數(shù)據(jù),以提高消費能力。一個分區(qū)只能由組內(nèi)一個消費者消費,不同消費者組之間互不影響。

Broker:一臺 Kafka 機(jī)器就是一個 Broker。一個集群是由多個 Broker 組成的且一個 Broker 可以容納多個 Topic。

Topic:可以簡單理解為隊列,Topic 將消息分類,生產(chǎn)者和消費者面向的都是同一個 Topic。

Partition:為了實現(xiàn)Topic擴(kuò)展性,提高并發(fā)能力,一個非常大的 Topic 可以分布到多個 Broker 上,一個 Topic 可以分為多個 Partition 進(jìn)行存儲,每個 Partition 是一個有序的隊列。

Replica:即副本,為實現(xiàn)數(shù)據(jù)備份的功能,保證集群中的某個節(jié)點發(fā)生故障時,該節(jié)點上的 Partition 數(shù)據(jù)不丟失,且 Kafka 仍然能夠繼續(xù)工作,為此Kafka提供了副本機(jī)制,一個 Topic 的每個 Partition 都有若干個副本,一個 Leader 副本和若干個 Follower 副本。

Leader:即每個分區(qū)多個副本的主副本,生產(chǎn)者發(fā)送數(shù)據(jù)的對象,以及消費者消費數(shù)據(jù)的對象,都是 Leader。

Follower:即每個分區(qū)多個副本的從副本,會實時從 Leader 副本中同步數(shù)據(jù),并保持和 Leader 數(shù)據(jù)的同步。Leader 發(fā)生故障時,某個 Follower 還會被選舉并成為新的 Leader , 且不能跟 Leader 在同一個broker上, 防止崩潰數(shù)據(jù)可恢復(fù)。

Offset:消費者消費的位置信息,監(jiān)控數(shù)據(jù)消費到什么位置,當(dāng)消費者掛掉再重新恢復(fù)的時候,可以從消費位置繼續(xù)消費。

ZooKeeper服務(wù):Kafka 集群能夠正常工作,需要依賴于 ZooKeeper,ZooKeeper 幫助 Kafka 存儲和管理集群元數(shù)據(jù)信息。在最新版本中, 已經(jīng)慢慢要脫離 ZooKeeper。

509bbd38-1942-11ee-962d-dac502259ad0.png50b66336-1942-11ee-962d-dac502259ad0.png

4 kafka集群架構(gòu)

工作流程

在了解kafka集群之前, 我們先來了解下kafka的工作流程, Kafka集群會將消息流存儲在 Topic 的中,每條記錄會由一個Key、一個Value和一個時間戳組成。

50db8486-1942-11ee-962d-dac502259ad0.png

Kafka 中消息是以 Topic 進(jìn)行分類的,生產(chǎn)者生產(chǎn)消息,消費者消費消息,讀取和消費的都是同一個 Topic。但是Topic 是邏輯上的概念, Partition 是物理上的概念,每個 Partition 對應(yīng)一個 log 文件,該 log 文件中存儲的就是 Producer 生產(chǎn)的數(shù)據(jù)。Producer 端生產(chǎn)的數(shù)據(jù)會不斷順序追加到該 log 文件末尾,并且每條數(shù)據(jù)都會記錄有自己的 Offset 。而消費者組中的每個消費者,也都會實時記錄當(dāng)前自己消費到了哪個 Offset,方便在崩潰恢復(fù)時,可以繼續(xù)從上次的 Offset 位置消費。

存儲機(jī)制

5148309a-1942-11ee-962d-dac502259ad0.png

此時 Producer 端生產(chǎn)的消息會不斷追加到 log 文件末尾,這樣文件就會越來越大, 為了防止 log 文件過大導(dǎo)致數(shù)據(jù)定位效率低下,那么Kafka 采取了分片和索引機(jī)制。它將每個 Partition 分為多個 Segment,每個 Segment 對應(yīng)4個文件:“.index” 索引文件, “.log” 數(shù)據(jù)文件, “.snapshot” 快照文件, “.timeindex” 時間索引文件。這些文件都位于同一文件夾下面,該文件夾的命名規(guī)則為:topic 名稱-分區(qū)號。例如, heartbeat心跳上報服務(wù) 這個 topic 有三個分區(qū),則其對應(yīng)的文件夾為 heartbeat-0,heartbeat-1,heartbeat-2這樣。

518c1652-1942-11ee-962d-dac502259ad0.png

index, log, snapshot, timeindex 文件以當(dāng)前 Segment 的第一條消息的 Offset 命名。其中 “.index” 文件存儲大量的索引信息,“.log” 文件存儲大量的數(shù)據(jù),索引文件中的元數(shù)據(jù)指向?qū)?yīng)數(shù)據(jù)文件中 Message 的物理偏移量。

下圖為index 文件和 log 文件的結(jié)構(gòu)示意圖:

51ae2bde-1942-11ee-962d-dac502259ad0.png

Replica - 副本

kafka中的 Partition 為了保證數(shù)據(jù)安全,每個 Partition 可以設(shè)置多個副本。此時我們對分區(qū)0,1,2分別設(shè)置3個副本(注:設(shè)置兩個副本是比較合適的)。而且每個副本都是有"角色"之分的,它們會選取一個副本作為 Leader 副本,而其他的作為 Follower 副本,我們的 Producer 端在發(fā)送數(shù)據(jù)的時候,只能發(fā)送到Leader Partition里面 ,然后Follower Partition會去Leader那自行同步數(shù)據(jù), Consumer 消費數(shù)據(jù)的時候,也只能從 Leader 副本那去消費數(shù)據(jù)的。

51f258f4-1942-11ee-962d-dac502259ad0.png523ef07e-1942-11ee-962d-dac502259ad0.png

Controller

Kafka Controller,其實就是一個 Kafka 集群中一臺 Broker,它除了具有普通Broker 的消息發(fā)送、消費、同步功能之外,還需承擔(dān)一些額外的工作。Kafka 使用公平競選的方式來確定 Controller ,最先在 ZooKeeper 成功創(chuàng)建臨時節(jié)點 /controller 的Broker會成為 Controller ,一般而言,Kafka集群中第一臺啟動的 Broker 會成為Controller,并將自身 Broker 編號等信息寫入ZooKeeper臨時節(jié)點/controller。

Offset 的維護(hù)

Consumer 在消費過程中可能會出現(xiàn)斷電宕機(jī)等故障,在 Consumer 恢復(fù)后,需要從故障前的 Offset 位置繼續(xù)消費。所以 Consumer 需要實時記錄自己消費到了哪個 Offset,以便故障恢復(fù)后繼續(xù)消費。在 Kafka 0.9 版本之前,Consumer 默認(rèn)將 Offset 保存在 ZooKeeper 中,但是從 0.9 版本開始,Consumer 默認(rèn)將 Offset 保存在 Kafka 一個內(nèi)置的 Topic 中,該 Topic 為 __consumer_offsets, 以支持高并發(fā)的讀寫。

5 總結(jié)

上面和大家一起深入探討了 Kafka 的簡介, 基礎(chǔ)知識和集群架構(gòu),后續(xù)會從Kafka 三高(高性能, 高可用, 高并發(fā))方面來詳細(xì)闡述其巧妙的設(shè)計思想。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7002

    瀏覽量

    88941
  • 管理系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    2485

    瀏覽量

    35903
  • kafka
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    5214

原文標(biāo)題:Kafka基礎(chǔ)入門篇

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    kafka設(shè)計原理的深度探討

    Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)。主要設(shè)計目標(biāo)如下: 以時間復(fù)雜度為O(1)的方式提供消息持久化能力,即使對TB級以上數(shù)據(jù)也能保證常數(shù)時間的訪問性能 高吞吐率。即使
    的頭像 發(fā)表于 10-08 07:50 ?2002次閱讀
    <b class='flag-5'>kafka</b>設(shè)計原理的深度探討

    [6.3.1]--6.3數(shù)據(jù)分發(fā)中間件Kafka簡介-視頻

    大數(shù)據(jù)
    學(xué)習(xí)電子知識
    發(fā)布于 :2022年12月27日 02:52:18

    Apache Kafka簡介(1)#分布式數(shù)據(jù)

    分布式數(shù)據(jù)
    未來加油dz
    發(fā)布于 :2023年07月03日 22:45:31

    Apache Kafka簡介(2)#分布式數(shù)據(jù)

    分布式數(shù)據(jù)
    未來加油dz
    發(fā)布于 :2023年07月03日 22:45:56

    Kafka特性和應(yīng)用場景

    Kafka簡介及部署
    發(fā)表于 06-17 09:31

    淺析kafka

    kafka常見問題
    發(fā)表于 09-29 10:09

    基于發(fā)布與訂閱的消息系統(tǒng)Kafka

    Kafka權(quán)威指南》——初識 Kafka
    發(fā)表于 03-05 13:46

    Kafka基礎(chǔ)入門文檔

    kafka系統(tǒng)入門教程(原理、配置、集群搭建、Java應(yīng)用、Kafka-manager)
    發(fā)表于 03-12 07:22

    Kafka集群環(huán)境的搭建

    1、環(huán)境版本版本:kafka2.11,zookeeper3.4注意:這里zookeeper3.4也是基于集群模式部署。2、解壓重命名tar -zxvf
    發(fā)表于 01-05 17:55

    Kafka的概念及Kafka的宕機(jī)

    問題要從一次Kafka的宕機(jī)開始說起。 筆者所在的是一家金融科技公司,但公司內(nèi)部并沒有采用在金融支付領(lǐng)域更為流行的 RabbitMQ ,而是采用了設(shè)計之初就為日志處理而生的 Kafka ,所以我一直
    的頭像 發(fā)表于 08-27 11:21 ?2093次閱讀
    <b class='flag-5'>Kafka</b>的概念及<b class='flag-5'>Kafka</b>的宕機(jī)

    物通博聯(lián)5G-kafka工業(yè)網(wǎng)關(guān)實現(xiàn)kafka協(xié)議對接到云平臺

    Kafka協(xié)議是一種基于TCP層的網(wǎng)絡(luò)協(xié)議,用于在分布式消息傳遞系統(tǒng)Apache Kafka中發(fā)送和接收消息。Kafka協(xié)議定義了客戶端和服務(wù)器之間的通信方式和數(shù)據(jù)格式,允許客戶端發(fā)送消息到K
    的頭像 發(fā)表于 07-11 10:44 ?501次閱讀

    Kafka架構(gòu)技術(shù):Kafka的架構(gòu)和客戶端API設(shè)計

    Kafka 給自己的定位是事件流平臺(event stream platform)。因此在消息隊列中經(jīng)常使用的 "消息"一詞,在 Kafka 中被稱為 "事件"。
    的頭像 發(fā)表于 10-10 15:41 ?2366次閱讀
    <b class='flag-5'>Kafka</b>架構(gòu)技術(shù):<b class='flag-5'>Kafka</b>的架構(gòu)和客戶端API設(shè)計

    kafka相關(guān)命令詳解

    kafka常用命令詳解
    的頭像 發(fā)表于 10-20 11:34 ?936次閱讀

    kafka基本原理詳解

    今天浩道跟大家分享一篇關(guān)于kafka相關(guān)原理的硬核干貨,可以說即使你沒有接觸過kafka,也可以秒懂,一起看看!
    的頭像 發(fā)表于 01-03 09:57 ?882次閱讀
    <b class='flag-5'>kafka</b>基本原理詳解

    超詳細(xì)“零”基礎(chǔ)kafka入門篇

    1、認(rèn)識kafka 1.1 kafka簡介 Kafka?是一個分布式流媒體平臺 kafka官網(wǎng):http://
    的頭像 發(fā)表于 12-18 09:50 ?149次閱讀
    超詳細(xì)“零”基礎(chǔ)<b class='flag-5'>kafka</b>入門篇
    RM新时代网站-首页