高併發面試必問:分散式消息系統Kafka簡介

来源:https://www.cnblogs.com/StarsBoy/archive/2018/11/29/10039258.html
-Advertisement-
Play Games

轉載:https://blog.csdn.net/caisini_vc/article/details/48007297 Kafka是分散式發佈-訂閱消息系統。它最初由LinkedIn公司開發,之後成為Apache項目的一部分。Kafka是一個分散式的,可劃分的,冗餘備份的持久性的日誌服務。它主要用 ...


轉載:https://blog.csdn.net/caisini_vc/article/details/48007297 Kafka是分散式發佈-訂閱消息系統。它最初由LinkedIn公司開發,之後成為Apache項目的一部分。Kafka是一個分散式的,可劃分的,冗餘備份的持久性的日誌服務。它主要用於處理活躍的流式數據。   在大數據系統中,常常會碰到一個問題,整個大數據是由各個子系統組成,數據需要在各個子系統中高性能,低延遲的不停流轉。傳統的企業消息系統並不是非常適合大規模的數據處理。為了已在同時搞定線上應用(消息)和離線應用(數據文件,日誌)Kafka就出現了。Kafka可以起到兩個作用:
  1. 降低系統組網複雜度。
  2. 降低編程複雜度,各個子系統不在是相互協商介面,各個子系統類似插口插在插座上,Kafka承擔高速數據匯流排的作用。
Kafka主要特點:
  1. 同時為發佈和訂閱提供高吞吐量。據瞭解,Kafka每秒可以生產約25萬消息(50 MB),每秒處理55萬消息(110 MB)。
  2. 可進行持久化操作。將消息持久化到磁碟,因此可用於批量消費,例如ETL,以及實時應用程式。通過將數據持久化到硬碟以及replication防止數據丟失。
  3. 分散式系統,易於向外擴展。所有的producer、broker和consumer都會有多個,均為分散式的。無需停機即可擴展機器。
  4. 消息被處理的狀態是在consumer端維護,而不是由server端維護。當失敗時能自動平衡。
  5. 支持online和offline的場景。
Kafka的架構 kafka kafka Kayka的整體架構非常簡單,是顯式分散式架構,producer、broker(kafka)和consumer都可以有多個。Producer,consumer實現Kafka註冊的介面,數據從producer發送到broker,broker承擔一個中間緩存和分發的作用。broker分發註冊到系統中的consumer。broker的作用類似於緩存,即活躍的數據和離線處理系統之間的緩存。客戶端和伺服器端的通信,是基於簡單,高性能,且與編程語言無關的TCP協議。幾個基本概念:
  1. Topic:特指Kafka處理的消息源(feeds of messages)的不同分類。
  2. Partition:Topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的隊列。partition中的每條消息都會被分配一個有序的id(offset)。
  3. Message:消息,是通信的基本單位,每個producer可以向一個topic(主題)發佈一些消息。
  4. Producers:消息和數據生產者,向Kafka的一個topic發佈消息的過程叫做producers。
  5. Consumers:消息和數據消費者,訂閱topics並處理其發佈的消息的過程叫做consumers。
  6. Broker:緩存代理,Kafka集群中的一臺或多台伺服器統稱為broker。
消息發送的流程: message
  1. Producer根據指定的partition方法(round-robin、hash等),將消息發佈到指定topic的partition裡面
  2. kafka集群接收到Producer發過來的消息後,將其持久化到硬碟,並保留消息指定時長(可配置),而不關註消息是否被消費。
  3. Consumer從kafka集群pull數據,並控制獲取消息的offset
Kayka的設計: 1、吞吐量 高吞吐是kafka需要實現的核心目標之一,為此kafka做了以下一些設計:
  1. 數據磁碟持久化:消息不在記憶體中cache,直接寫入到磁碟,充分利用磁碟的順序讀寫性能
  2. zero-copy:減少IO操作步驟
  3. 數據批量發送
  4. 數據壓縮
  5. Topic劃分為多個partition,提高parallelism
2、負載均衡
  1. producer根據用戶指定的演算法,將消息發送到指定的partition
  2. 存在多個partiiton,每個partition有自己的replica,每個replica分佈在不同的Broker節點上
  3. 多個partition需要選取出lead partition,lead partition負責讀寫,並由zookeeper負責fail over
  4. 通過zookeeper管理broker與consumer的動態加入與離開
3、拉取系統 由於kafka broker會持久化數據,broker沒有記憶體壓力,因此,consumer非常適合採取pull的方式消費數據,具有以下幾點好處:
  1. 簡化kafka設計
  2. consumer根據消費能力自主控制消息拉取速度
  3. consumer根據自身情況自主選擇消費模式,例如批量,重覆消費,從尾端開始消費等
4、可擴展性 當需要增加broker結點時,新增的broker會向zookeeper註冊,而producer及consumer會根據註冊在zookeeper上的watcher感知這些變化,並及時作出調整。 Kafka的應用場景: 1、消息隊列 比起大多數的消息系統來說,Kafka有更好的吞吐量,內置的分區,冗餘及容錯性,這讓Kafka成為了一個很好的大規模消息處理應用的解決方案。消息系統一般吞吐量相對較低,但是需要更小的端到端延時,並嘗嘗依賴於Kafka提供的強大的持久性保障。在這個領域,Kafka足以媲美傳統消息系統,如ActiveMR或RabbitMQ。 2、行為跟蹤 Kafka的另一個應用場景是跟蹤用戶瀏覽頁面、搜索及其他行為,以發佈-訂閱的模式實時記錄到對應的topic里。那麼這些結果被訂閱者拿到後,就可以做進一步的實時處理,或實時監控,或放到hadoop/離線數據倉庫里處理。 3、元信息監控 作為操作記錄的監控模塊來使用,即彙集記錄一些操作信息,可以理解為運維性質的數據監控吧。 4、日誌收集 日誌收集方面,其實開源產品有很多,包括Scribe、Apache Flume。很多人使用Kafka代替日誌聚合(log aggregation)。日誌聚合一般來說是從伺服器上收集日誌文件,然後放到一個集中的位置(文件伺服器或HDFS)進行處理。然而Kafka忽略掉文件的細節,將其更清晰地抽象成一個個日誌或事件的消息流。這就讓Kafka處理過程延遲更低,更容易支持多數據源和分散式數據處理。比起以日誌為中心的系統比如Scribe或者Flume來說,Kafka提供同樣高效的性能和因為複製導致的更高的耐用性保證,以及更低的端到端延遲。 5、流處理 這個場景可能比較多,也很好理解。保存收集流數據,以提供之後對接的Storm或其他流式計算框架進行處理。很多用戶會將那些從原始topic來的數據進行階段性處理,彙總,擴充或者以其他的方式轉換到新的topic下再繼續後面的處理。例如一個文章推薦的處理流程,可能是先從RSS數據源中抓取文章的內容,然後將其丟入一個叫做“文章”的topic中;後續操作可能是需要對這個內容進行清理,比如回覆正常數據或者刪除重覆數據,最後再將內容匹配的結果返還給用戶。這就在一個獨立的topic之外,產生了一系列的實時數據處理的流程。Strom和Samza是非常著名的實現這種類型數據轉換的框架。 6、事件源 事件源是一種應用程式設計的方式,該方式的狀態轉移被記錄為按時間順序排序的記錄序列。Kafka可以存儲大量的日誌數據,這使得它成為一個對這種方式的應用來說絕佳的後臺。比如動態彙總(News feed)。 7、持久性日誌(commit log) Kafka可以為一種外部的持久性日誌的分散式系統提供服務。這種日誌可以在節點間備份數據,併為故障節點數據回覆提供一種重新同步的機制。Kafka中日誌壓縮功能為這種用法提供了條件。在這種用法中,Kafka類似於Apache BookKeeper項目。 Kayka的設計要點: 1、直接使用linux 文件系統的cache,來高效緩存數據。   2、採用linux Zero-Copy提高發送性能。傳統的數據發送需要發送4次上下文切換,採用sendfile系統調用之後,數據直接在內核態交換,系統上下文切換減少為2次。根據測試結果,可以提高60%的數據發送性能。Zero-Copy詳細的技術細節可以參考:https://www.ibm.com/developerworks/linux/library/j-zerocopy/   3、數據在磁碟上存取代價為O(1)。kafka以topic來進行消息管理,每個topic包含多個part(ition),每個part對應一個邏輯log,有多個segment組成。每個segment中存儲多條消息(見下圖),消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲位置,避免id到位置的額外映射。每個part在記憶體中對應一個index,記錄每個segment中的第一條消息偏移。發佈者發到某個topic的消息會被均勻的分佈到多個part上(隨機或根據用戶指定的回調函數進行分佈),broker收到發佈消息往對應part的最後一個segment上添加該消息,當某個segment上的消息條數達到配置值或消息發佈時間超過閾值時,segment上的消息會被flush到磁碟,只有flush到磁碟上的消息訂閱者才能訂閱到,segment達到一定的大小後將不會再往該segment寫數據,broker會創建新的segment。   4、顯式分散式,即所有的producer、broker和consumer都會有多個,均為分散式的。Producer和broker之間沒有負載均衡機制。broker和consumer之間利用zookeeper進行負載均衡。所有broker和consumer都會在zookeeper中進行註冊,且zookeeper會保存他們的一些元數據信息。如果某個broker和consumer發生了變化,所有其他的broker和consumer都會得到通知。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看git版本,卸載舊版本(如果沒有安裝git請直接到下一步) 安裝依賴軟體 編譯安裝最新的git版本 添加到環境變數 好了最新的git就裝好了。 歡迎關註公眾號 ...
  • DMZ是網路的一個區域,介於外網與內網之間的一個特殊區域,既然說他特殊,就有他的特殊性,也成隔離區。在傳統意義上,安裝了防火牆後,外部網路是不能訪問內部網路的,要不還要防火牆幹啥,假如說外部網路想要訪問內部網路,比如內部網路有台WEB主機,對外提供服務,就得解決安裝防火牆之後的矛盾了, DMZ防火牆 ...
  • MongoDB有主從複製和副本集兩種主從複製模式,主從複製最大的問題就是無法自動故障轉移,MongoDB副本集解決了主從模式無法自動故障轉義的特點,因此是複製的首選。對於簡單的主從複製無法自動故障轉移的缺陷,各個資料庫都在改進,MySQL推出的MGR,Redis的哨兵,Mongodb的複製集。 對於 ...
  • dbpath下是清一色的collection-n-***與index-n-***開頭的物理文件,如何知道某一個集合與其對應與其對應的物理文件? db.collection_name.stats() 返回的結果包含集合數據對應的物理文件 db.collection_name.stats({indexD ...
  • 2017年下半年新發佈的MongoDB 3.6版本在安全性上做了很大提升,主要歸結為兩點: 1.將將bind_ip 預設值修改為了localhost; 2. 在db.createUser()和 db.updateUser()中添加了authenticationRestrictions 參數,可以用來 ...
  • 檢查主備機的sys 密碼是否一致,忘記密碼可以修改,同步 。alter user sys identified by xxx; orapwd file=oraxxx.ora password=admin entries=40force=y; 檢查靜態tnsnames.ora 和listener.or... ...
  • 上一篇主要介紹了MongoDB的基本操作,包括創建、插入、保存、更新和查詢等,鏈接為 "MongoDB基本操作" 。 在本文中主要介紹MongoDB的聚合以及與Python的交互。 MongoDB聚合 什麼是聚合 MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等), ...
  • 最近遇到上面這個問題,一開始我就果斷否決了資料庫保存圖片的策略,主要是太蠢!事實上我的決定是正確的,我僅僅理解為mysql讀寫性能提高的境界,具體為什麼可以提高?很模糊,知道我看到了這裡: 大佬做的實驗:https://www.oschina.net/translate/repeat-after-m ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...