Kafka牛逼在哪裡?

来源:https://www.cnblogs.com/jiagooushi/archive/2022/11/30/16938289.html
-Advertisement-
Play Games

一、Kafka存在哪些方面的優勢 1. 多生產者 可以無縫地支持多個生產者,不管客戶端在使用單個主題還是多個主題。 2. 多消費者 支持多個消費者從一個單獨的消息流上讀取數據,而且消費者之間互不影響。 3. 基於磁碟的數據存儲 支持消費者非實時地讀取消息,由於消息被提交到磁碟,根據設置的規則進行保存 ...


一、Kafka存在哪些方面的優勢

1. 多生產者

可以無縫地支持多個生產者,不管客戶端在使用單個主題還是多個主題。

2. 多消費者

支持多個消費者從一個單獨的消息流上讀取數據,而且消費者之間互不影響。

3. 基於磁碟的數據存儲

支持消費者非實時地讀取消息,由於消息被提交到磁碟,根據設置的規則進行保存。當消費者發生異常時候,意外離線,由於有持久化的數據保證,可以實現聯機後從上次中斷的地方繼續處理消息。

4. 伸縮性

用戶在開發階段可以先試用單個broker,再擴展到包含3個broker的小型開發集群,然後隨著數據量不斷增長,部署到生產環境的集群可能包含上百個broker。

5. 高性能

Kafka可以輕鬆處理巨大的消息流,在處理大量數據的同事,它還能保證亞秒級的消息延遲。

二、Kafka常見的使用場景

1. 消息

kafka更好的替換傳統的消息系統,消息系統被用於各種場景(解耦數據生產者,緩存未處理的消息等),與大多數消息系統比較,kafka有更好的吞吐量,內置分區,副本和故障轉移,這有利於處理大規模的消息。

根據我們的經驗,消息往往用於較低的吞吐量,但需要低的端到端延遲,並需要提供強大的耐用性的保證。

在這一領域的kafka比得上傳統的消息系統,如ActiveMQ或RabbitMQ等。

2. 網站活動追蹤

kafka原本的使用場景是用戶的活動追蹤,網站的活動(網頁游覽,搜索或其他用戶的操作信息)發佈到不同的話題中心,這些消息可實時處理,實時監測,也可載入到Hadoop或離線處理數據倉庫。

3. 指標

kafka也常常用於監測數據。分散式應用程式生成的統計數據集中聚合。

4. 日誌聚合

許多人使用Kafka作為日誌聚合解決方案的替代品。日誌聚合通常從伺服器中收集物理日誌文件,並將它們放在中央位置(可能是文件伺服器或HDFS)進行處理。Kafka抽象出文件的細節,並將日誌或事件數據更清晰地抽象為消息流。這允許更低延遲的處理並更容易支持多個數據源和分散式數據消費。

5. 流處理

kafka中消息處理一般包含多個階段。其中原始輸入數據是從kafka主題消費的,然後彙總,豐富,或者以其他的方式處理轉化為新主題,例如,一個推薦新聞文章,文章內容可能從“articles”主題獲取;然後進一步處理內容,得到一個處理後的新內容,最後推薦給用戶。這種處理是基於單個主題的實時數據流。從0.10.0.0開始,輕量,但功能強大的流處理,就可以這樣進行數據處理了。

除了Kafka Streams,還有Apache Storm和Apache Samza可選擇。

6. 事件採集

事件採集是一種應用程式的設計風格,其中狀態的變化根據時間的順序記錄下來,kafka支持這種非常大的存儲日誌數據的場景。

7. 提交日誌

kafka可以作為一種分散式的外部日誌,可幫助節點之間複製數據,並作為失敗的節點來恢複數據重新同步,kafka的日誌壓縮功能很好的支持這種用法,這種用法類似於Apacha BookKeeper項目。

三、Kafka架構深度剖析

file

1. Kafka數據處理步驟

1.1 Producer產生消息,發送到Broker中

1.2 Leader狀態的Broker接收消息,寫入到相應topic中

1.3 Leader狀態的Broker接收完畢以後,傳給Follow狀態的Broker作為副本備份

1.4 Consumer消費Broker中的消息

2. Kafka 核心組件

2.1 Producer:消息生產者,產生的消息將會被髮送到某個topic

2.2 Consumer:消息消費者,消費的消息內容來自某個topic

2.3 Topic:消息根據topic進行歸類,topic其本質是一個目錄,即將同一主題消息歸類到同一個目錄

2.4 Broker:每一個kafka實例(或者說每台kafka伺服器節點)就是一個broker,一個broker可以有多個topic

2.5 Zookeeper: Zookeeper集群不屬於kafka內的組件,但kafka依賴 Zookeeper集群保存meta信息,所以在此做聲明其重要性。

3. broker和集群

一個獨立的Kafka伺服器稱為broker,broker接收來自生產者的消息,為消息設置偏移量,並提交消息到磁碟保存。broker為消費者提供服務,對讀取分區的請求作出響應,返回已經提交到磁碟上的消息。根據特定的硬體及其性能特征,單個broker可以輕鬆處理數千個分區以及每秒百萬級的消息量。

broker是集群的組成部分。每個集群都有一個broker同時充當了集群控制器的角色(自動從集群的活躍成員中選舉出來)。控制器負責管理工作,包括將分區分配給broker和監控broker。在集群中,一個分區從屬於一個broker,該broker被稱為分區的首領。一個分區可以分配多個broker,這個時候會發生分區複製。這種複製機製為分區提供了消息冗餘,如果一個broker失效,其他broker可以接管領導權。不過,相關的消費者和生產者都要重新連接到新的首領。

4. Consumer與topic關係

kafka只支持Topic

• 每個group中可以有多個consumer,每個consumer屬於一個consumer group;通常情況下,一個group中會包含多個consumer,這樣不僅可以提高topic中消息的併發消費能力,而且還能提高”故障容錯”性,如果group中的某個consumer失效那麼其消費的partitions將會由其它consumer自動接管。

• 對於Topic中的一條特定的消息,只會被訂閱此Topic的每個group中的其中一個consumer消費,此消息不會發送給一個group的多個consumer;那麼一個group中所有的consumer將會交錯的消費整個Topic,每個group中consumer消息消費互相獨立,我們可以認為一個group是一個”訂閱”者。

• 在kafka中,一個partition中的消息只會被group中的一個consumer消費(同一時刻);
一個Topic中的每個partions,只會被一個”訂閱者”中的一個consumer消費,不過一個consumer可以同時消費多個partitions中的消息。

• kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,否則將意味著某些consumer將無法得到消息,而處於空閑狀態。

kafka只能保證一個partition中的消息被某個consumer消費時是順序的;事實上,從Topic角度來說,當有多個partitions時,****消息仍不是全局有序的。

5. Kafka消息的分發

• Producer客戶端負責消息的分發

• kafka集群中的任何一個broker都可以向producer提供metadata信息,這些metadata中包含集群中存活的servers列表”“partitions leader**列表”等信息;

• 當producer獲取到metadata信息之後, producer將會和Topic下所有partition leader保持socket連接;

• 消息由producer直接通過socket發送到broker,中間不會經過任何”路由層”。事實上,消息被路由到哪個partition上由producer客戶端決定,比如可以採用”random””key-hash””輪詢”等。

如果一個topic中有多個partitions,那麼在producer端實現”消息均衡分發”**是必要的。

• 在producer端的配置文件中,開發者可以指定partition路由的方式。

• Producer消息發送的應答機制

設置發送數據是否需要服務端的反饋,有三個值0,1,-1

0: producer不會等待broker發送ack

1: 當leader接收到消息之後發送ack

2: 當所有的follower都同步消息成功後發送ack

request.required.acks=0

6. Consumer的負載均衡

當一個group中,有consumer加入或者離開時,會觸發partitions均衡.均衡的最終目的,是提升topic的併發消費能力,步驟如下:

  1. 假如topic1,具有如下partitions: P0,P1,P2,P3

  2. 加入group A 中,有如下consumer: C0,C1

  3. 首先根據partition索引號對partitions排序: P0,P1,P2,P3

  4. 根據consumer.id排序: C0,C1

  5. 計算倍數: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)

  6. 然後依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]
    

本文由傳智教育博學谷教研團隊發佈。

如果本文對您有幫助,歡迎關註點贊;如果您有任何建議也可留言評論私信,您的支持是我堅持創作的動力。

轉載請註明出處!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 我們的springboot應用程式的持久層,是用jeecgboot框架生成的代碼。mybatisplus版本是3.1.2。 在一次對當前程式的sql性能優化時,我重寫了BaseMapper的selectPage方法。其中,為Wrapper<T>參數加上了id限制,以提高sql執行性能。 imp ...
  • 一.小結 1.不可變對象一旦創建,就不能改變。為防止用戶修改對象,可以定義不可變類。 2.實例變數和靜態變數的作用域是整個類,與變數在何處聲明無關。實例變數和靜態變數可以在類中的任意位置聲明。為保持一致,最好在類的起始位置聲明它們。 3.關鍵字this可用於表明調用對象。關鍵字this也可以用在構造 ...
  • 序言 各位好啊,我是會編程的蝸牛,作為java開發者,我們每天都要和開發工具打交道。我以前一開始入門java開發的時候,就是用的eclipse,雖然感覺有點繁瑣,但好在還能用。後來偶然間發現了IDEA,然後就漸漸被IDEA所吸引了,不過最近在做一些老項目的開發,大概是十幾年的那種技術,我發現用IDE ...
  • 前言 本文是博主從事後端開發以來,對公司、個人項目的經驗總結,包含代碼編寫、功能推薦、第三方庫使用及優雅配置等,希望大家看到都能有所收穫 博主github地址: https://github.com/wayn111 一. 優雅的進行線程池異常處理 在Java開發中,線程池的使用必不可少,使用無返回值 ...
  • 重構項目目錄 celery_task: logs:項目運行時/開發時日誌目錄包 luffapi:項目同名文件夾 apps:項目所有應用的集合文件夾 libs:第三方類庫的保存目錄[第三方組件、模塊] - 包 media:用戶提交的文件目錄文件夾 settings:配置目錄,包含開發時的配置文件和上線 ...
  • 話說在前面,我不是小黑子~ 我是超級大黑子😏 表弟大周末的跑來我家,沒事幹天天騷擾我,搞得我都不能跟小姐姐好好聊天了,於是為了打發表弟,我決定用Python做一個小游戲來消耗一下他的精力,我思來想去,決定把他變成小黑子,於是做了一個坤坤打籃球的游戲,沒想到他還挺愛玩的~ 終於解放了,於是我把游戲寫 ...
  • 使用腳本自動跑實驗(Ubuntu),將實驗結果記錄在文件中,併在實驗結束之後將結果通過郵件發送到郵箱,最後在windows端自動解析成excel表格。 ...
  • 大家好,我是陶朱公Boy。 前言 上一篇文章《關於狀態機的技術選型,最後一個真心好》我跟大家聊了一下關於”狀態機“的話題。從眾多技術選型中我也推薦了一款阿裡開源的狀態機—“cola-statemachine”。 於是就有小伙伴私信我,自己項目也考慮引入這款狀態機,但網上資料實在太少,能不能系統的介紹 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...