Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

来源:https://www.cnblogs.com/xueSpring/archive/2019/02/15/10385562.html
-Advertisement-
Play Games

一.瞭解淘寶Kafka架構 在ActiveMQ、RabbitMQ、RocketMQ、Kafka消息中間件之間,我們為什麼要選擇Kafka?下麵詳細介紹一下,2012年9月份我在支付寶做餘額寶研發,2013年6月支付寶正式推出餘額寶,2013年8月擔任支付寶淘寶彩票項目經理帶領兄弟們一起做研發,期間需 ...


一.瞭解淘寶Kafka架構

在ActiveMQ、RabbitMQ、RocketMQ、Kafka消息中間件之間,我們為什麼要選擇Kafka?下麵詳細介紹一下,2012年9月份我在支付寶做餘額寶研發,2013年6月支付寶正式推出餘額寶,2013年8月擔任支付寶淘寶彩票項目經理帶領兄弟們一起做研發,期間需要與淘寶和500萬對接競彩介面數據,業餘時間與淘寶的同事溝通,瞭解天貓在電商節如何處理這些大數據的?技術架構上採用了哪些策略呢?

一、應用無狀態(淘寶session框架)

二、有效使用緩存(Tair)

三、應用拆分(HSF)

四、資料庫拆分(TDDL)

五、非同步通信(Notify)

六、非結構化數據存儲 ( TFS,NOSQL)

七、監控、預警系統

八、配置統一管理

天貓的同事把大致的架構跟我描述了一番,心有感悟。咱們來看一下2018年雙11當天的成交額。

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

 

二.kafka實現天貓億萬級數據統計架構

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

 

Flume是Cloudera提供的一個高可用的,高可靠的,分散式的海量日誌採集、聚合和傳輸的系統,Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力

  • Data Access:數據通道
  • Computing:計算
  • Persistence:執行保存方式
  • spout:表示一個流的源頭,產生tuple
  • bolt:處理輸入流並產生多個輸出流,可以做簡單的數據轉換計算,複雜的流處理一般需要經過多個bolt進行處理

為什麼不能用分散式文件HDFS集群?

1、實時性:hdfs的實時性沒有kafka高。

2、消費量的記錄:hdfs不會記錄你這個塊文件消費到了哪裡,而基於zookeeper的kafka會記錄你消費的點。

3、併發消費:hdfs不支持併發消費,而kafka支持併發消費,即多個consumer.

4、彈性且有序:當數據量會很大,而且處理完之後就可以刪除時,頻繁的讀寫會對hdfs中NameNode造成很大的壓力。而kafka的消費點是記錄在zookeeper的,並且kafka的每條數據都是有“坐標”的,所以消費的時候只要這個“坐標”向後移動就行了,而且刪除的時候只要把這個“坐標”之前的數據刪掉即可。

三.什麼是Kafka?

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

 

通過上圖就可以瞭解到,生產者Producers(農民和廚師),消費主題top(魚,骨頭,草,香蕉),消費者Comsumer(貓,狗,老牛,猴子),生產者根據消費主題獲取自己想要的食物

四.Kafka架構原理

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

 

五.Kafka能幫我們解決什麼問題?

請高手指明一下kafka解決了什麼問題,什麼場景下使用?消息訂閱和發佈嗎,好像redis也支持,功能是否有重疊?

一.消息隊列

假設你意氣風發,要開發新一代的互聯網應用,以期在互聯網事業中一展巨集圖。藉助雲計算,很容易開發出如下原型系統:

  • Web應用:部署在雲伺服器上,為個人電腦或者移動用戶提供的訪問體驗。
  • SQL資料庫:為Web應用提供數據持久化以及數據查詢。
Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

 

這套架構簡潔而高效,很快能夠部署到百度雲等雲計算平臺,以便快速推向市場。互聯網不就是講究小步快跑嘛!

好景不長。隨著用戶的迅速增長,所有的訪問都直接通過SQL資料庫使得它不堪重負,不得不加上緩存服務以降低SQL資料庫的荷載;為了理解用戶行為,開始收集日誌並保存到Hadoop上離線處理,同時把日誌放在全文檢索系統中以便快速定位問題;由於需要給投資方看業務狀況,也需要把數據彙總到數據倉庫中以便提供互動式報表。此時的系統的架構已經盤根錯節了,考慮將來還會加入實時模塊以及外部數據交互,真是痛並快樂著……

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

 

這時候,應該跑慢一些,讓靈魂跟上來。

本質上,這是一個數據集成問題。沒有任何一個系統能夠解決所有的事情,所以業務數據根據不同用途存而放在不同的系統,比如歸檔、分析、搜索、緩存等。數據冗餘本身沒有任何問題,但是不同系統之間像義大利麵條一樣複雜的數據同步卻是挑戰。

這時候就輪到Kafka出場了。

Kafka可以讓合適的數據以合適的形式出現在合適的地方。Kafka的做法是提供消息隊列,讓生產者單往隊列的末尾添加數據,讓多個消費者從隊列裡面依次讀取數據然後自行處理。之前連接的複雜度是O(N^2),而現在降低到O(N),擴展起來方便多了:

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

 

在Kafka的幫助下,你的互聯網應用終於能夠支撐飛速增長的業務,成為下一個BAT指日可待。

以上故事說明瞭Kafka主要用途是數據集成,或者說是流數據集成,以Pub/Sub形式的消息匯流排形式提供。但是,Kafka不僅僅是一套傳統的消息匯流排,本質上Kafka是分散式的流數據平臺,因為以下特性而著名:

  • 提供Pub/Sub方式的海量消息處理。
  • 以高容錯的方式存儲海量數據流。
  • 保證數據流的順序。

二.日誌採集

隨著互聯網的不斷發展,用戶所產生的行為數據被越來越多的網站重視,如何對於用戶信息進行採集則越來越受到重視,下麵就為大家介紹基於Kafka的服務端用戶行為日誌採集方式。

1. 技術選型

服務端日誌採集主要通過在Controller的介面中進行埋點,然後通過AOP技術、Kafka消息系統以及logback對用戶行為進行採集。

之所以使用AOP技術是因為AOP的以下重要特定:

  • 代碼的侵入性小。對於業務代碼的侵入性小,只需要在Controller的介面上添加註解,然後在其他模塊對用戶行為進行採集。
  • 重用性。對於相同作用的代碼可以進行重用。
  • 擴展性。能夠很好的對系統進行擴展。

由於使用非同步方式對用戶行為信息進行收集,因此需要使用消息中間件。目前消息中間件非常多,比較流行的有ActiveMQ、ZeroMQ、RabbitMQ、Kafka等。每個消息中間件都有各種的優勢劣勢,之所以使用Kafka消息中間件,是因為以下幾點因素:

  • 高性能。每秒鐘可以處理數以千計生產者生成的消息。
  • 高擴展性。可以通過簡單的增加伺服器橫向擴展Kafka集群的容量。
  • 分散式。消息來自數以千計的服務,使用分散式來解決單機處理海量數據的瓶頸。
  • 持久性。Kafka中的消息可以持久化到硬碟上,這樣可以防止數據的丟失。

因為用戶的行為數據最終是以日誌的形式持久化的,因此使用logback對日誌持久化到日誌伺服器中。

2.總體架構

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

圖1 總體架構圖

服務端日誌採集系統主要由兩個工程組成:陸金所-bi-core和lu-bi-service。由於中國平安陸金所使用dubbo框架,因此有服務提供方和服務消費方。lu-bi-core被web、wap和mainsite服務消費方依賴。此外,lu-bi-service也依賴於lu-bi-core,主要是依賴於其中的一些實體類及工具類。

lu-bi-core工程為Kafka消息的生產者,主要封裝實現切麵的具體邏輯,其主要職責如下:

  • 解析用戶請求的Request信息:從Request中提取用戶的基本信息,如設備型號、用戶的供應商、ip、設備的解析度、設備平臺、設備的操作系統、設備id、app渠道等。
  • 介面對應的參數:通過切麵可以提取介面的參數值,從而知道用戶的業務信息。
  • 應用層返回的結果信息:因為切麵使用AfterReturning方式,因此可以獲取用層的返回結果,從返回結果中可以提取有用的信息。
  • 用戶的基本信息:用戶的id信息。
  • 信息格式化:將信息轉化成JSON字元串。
  • 發送消息:將最終需要發送的消息放入本地阻塞隊列中,通過另一個線程非同步從阻塞隊列中獲取消息併發送到Kafka Broker中。

lu-bi-service工程為Kafka消息的消費者,其主要職責如下:

  • 實時從Kafka中拉取最新的數據。
  • 將JSON字元串轉化成,方便進一步對用信息進行加工。
  • 對用戶的ip進行解析,獲取ip對應的地區以及經緯度信息。
  • 將加工好的最終信息持久化到log文件中。

3.部署圖

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

圖2 部署圖

上圖為陸金所與日誌系統系統相關的部署圖,App、Wap和Mainsite伺服器集群分別對應不同終端的應用。Kafka集群使用杭研的集群,目前有10個Broker。日誌伺服器有兩台,通過Kafka的均衡策略對日誌進行消費。

4.日誌採集的流程

日誌採集流程圖如下所示:

Kafka對Java程式員有多重要?連阿裡都再用它處理億萬級數據統計

圖3 日誌打點流程圖

上圖為消息生產者和消息消費者共同組成的流程圖。

  • 消息生產者的具體步驟如下:
  • 通過切麵攔截用戶的請求。
  • 從切麵中提取請求頭的基本信息,如設備信息,cookie信息,ip信息等。
  • 提取請求的介面參數信息。
  • 從介面返回值中提取相關信息,如id,pvid等。
  • 將提取的信息封裝成JSON字元串,放到阻塞隊列中,假如阻塞隊列溢出會有三次重試機制。
  • 非同步線程從本地阻塞隊列中獲取數據,並將信息組裝發送到Kafka的Broker中,此時消息生產者結束。

消息消費者的具體步驟如下:

  • 實時從Kafka Broker中批量拉取消息。
  • 將拉取的消息轉化成對象。
  • 解析ip對應的國家、省份、城市、經緯度信息。
  • 對不同業務場景的信息進一步解析。
  • 將日誌信息轉化成JSON字元串,持久化到log文件中。

5. 相關配置

  • application-XXX.properties:該配置放Kafka的相關屬性,包括topic、groupId、server等信息。
  • lu-log-msg.xml:該配置放在app-web,mainsite-web,wap-web的src/main/resources目錄下,主要是初始化kafka生產者的信息。
  • lu-bi-service.xml:該配置放在lu-bi-service工程的src/main/resources目錄下,主要用於載入kafka消費者的配置信息,並且啟動kafka消費者服務。
  • logback.xml:該配置放在lu-bi-service工程的src/main/resources目錄下,主要用於聲明日誌文件存放的目錄,需要持久化的日誌的package路徑,以及日誌持久化的格式。
  • ip_conf.txt:該配置放在lu-bi-service工程的src/main/resources目錄下,用於解析ip對應的地域、經緯度等信息。

六.關於面試問題

1.Redis和Kafka區別?

作者跟大家舉個例子:

老闆有個好消息要告訴大家,公司要發放年終獎,有兩個辦法:

1.到會議室每個座位上挨個兒告訴每個人。什麼?張三去上廁所了?那張三就只能錯過好消息了!

2.老闆把消息寫到會議上的黑板報上,誰想知道就來看一下,什麼?張三請假了?沒關係,我一周之後才擦掉,總會看見的!什麼張三請假兩周?那就算了,我反正只保留一周,不然其他好消息沒地方寫了

redis用第一種辦法,kafka用第二種辦法,知道什麼區別了吧

Redis PUB/SUB使用場景:

1. 消息持久性需求不高

2. 吞吐量要求不高

3. 可以忍受數據丟失

4. 數據量不大

Kafka使用場景:

上面以外的其他場景:)

1. 高可靠性

2. 高吞吐量

3. 持久性高

Kafka、RabbitMQ、RocketMQ等消息中間件的對比

有關測試結論

Kafka的吞吐量高達17.3w/s,不愧是高吞吐量消息中間件的行業老大。這主要取決於它的隊列模式保證了寫磁碟的過程是線性IO。此時broker磁碟IO已達瓶頸。

RocketMQ也表現不俗,吞吐量在11.6w/s,磁碟IO %util已接近100%。RocketMQ的消息寫入記憶體後即返回ack,由單獨的線程專門做刷盤的操作,所有的消息均是順序寫文件。

RabbitMQ的吞吐量5.95w/s,CPU資源消耗較高。它支持AMQP協議,實現非常重量級,為了保證消息的可靠性在吞吐量上做了取捨。我們還做了RabbitMQ在消息持久化場景下的性能測試,吞吐量在2.6w/s左右。

在服務端處理同步發送的性能上,Kafka>RocketMQ>RabbitMQ

寫在最後

如今都在談論寒冬有多可怕,筆者作為一個過來人,卻有不同的看法:寒冬不可怕,在寒冬里沒有生存能力,才是最可怕的。

因此小編總結了這幾年在阿裡的工作經驗並結合目前互聯網最主流的Java架構技術,最後錄製了七大Java架構技術專題視頻(源碼閱讀、分散式架構、微服務、性能優化、阿裡項目實戰、Devops、併發編程)分享在我的裙669275137中,並且每晚我都會在群內直播講解這些架構技術的底層實現原理,感興趣的程式員們可以加群找管理員獲取。


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

-Advertisement-
Play Games
更多相關文章
  • wxml文件 wxss文件 js文件 效果圖: ...
  • 在for迴圈中使用let時,結果如下 for內部定義的i在迴圈結束後不會覆蓋外部的i 在for迴圈中使用var,且不控制i的作用域時,結果如下 第一個for迴圈內部定義的i並不會創建,而是直接使用外部中的i,故在迴圈結束時外部的i變為了5。 第二個for迴圈直接使用了外部的i 把第一個for迴圈存於 ...
  • 這兩天擺弄webpack,躺過很多坑,直到今天看了一位博主的文章才得以解決。他對配置中的各個部分做說明。 下麵的配置99.9%抄自博主: https://www.cnblogs.com/nianyifenzhizuo/p/10271001.html 安裝package.json中的node-sass ...
  • 本篇博客主要是介紹如何使用css在盒子四個邊框顯示四個藍色邊角 ...
  • 有時我們看見js函數後面跟著多個小括弧是什麼意思?f( )( )( )... f()執行f函數,返回子函數 f()()執行子函數,返回孫函數 f()()()執行孫函數,返回重孫函數 ... ... 但註意,如果想這樣執行,函數結構必須是這樣,f的函數體里要return 子函數,子函數里要return ...
  • JSON詳解 JSON詳解 閱讀目錄 JSON的兩種結構 認識JSON字元串 在JS中如何使用JSON 在.NET中如何使用JSON 總結 JSON的全稱是”JavaScript Object Notation”,意思是JavaScript對象表示法,它是一種基於文本,獨立於語言的輕量級數據交換格式 ...
  • 應用:ActionSheet("","修改IP鏈接後會 有可能 導致 無法登錄 ,是否進行修改?"); 其他參數就不寫了,自己看情況加上去 結果: // 以下內容為代碼中附帶的代碼 // 附上請求數據的 GetData 方法 的代碼(這個方法可換成你們自己的請求數據的方法,不唯一): 附上 Load ...
  • Canvas是HTML5新增的組件,它就像一塊幕布,可以用JavaScript在上面繪製各種圖表、動畫等。 沒有Canvas的年代,繪圖只能藉助Flash插件實現,頁面不得不用JavaScript和Flash進行交互。有了Canvas,我們就再也不需要Flash了,直接使用JavaScript完成繪 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...