大數據實時項目必備技能二:kafka有話說

導讀: Kafka是由LinkedIn開發並開源的分佈式消息系統,因其分佈式及高吞吐率而被廣泛使用,現已與Cloudera Hadoop,Apache Storm,Apache Spark集成。

Kafka創建背景

Kafka是一個消息系統,原本開發自LinkedIn,用作LinkedIn的活動流(Activity Stream)和運營數據處理管道(Pipeline)的基礎。現在它已被多家不同類型的公司 作為多種類型的數據管道和消息系統使用。

活動流數據是幾乎所有站點在對其網站使用情況做報表時都要用到的數據中最常規的部分。活動數據包括頁面訪問量(Page View)、被查看內容方面的信息以及搜索情況等內容。這種數據通常的處理方式是先把各種活動以日誌的形式寫入某種文件,然後週期性地對這些文件進行統計分析。運營數據指的是服務器的性能數據(CPU、IO使用率、請求時間、服務日誌等等數據)。運營數據的統計方法種類繁多。

近年來,活動和運營數據處理已經成為了網站軟件產品特性中一個至關重要的組成部分,這就需要一套稍微更加複雜的基礎設施對其提供支持。

Kafka簡介

Kafka是一種分佈式的,基於發佈/訂閱的消息系統。主要設計目標如下:

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

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

支持Kafka Server間的消息分區,及分佈式消費,同時保證每個Partition內的消息順序傳輸

同時支持離線數據處理和實時數據處理

Scale out:支持在線水平擴展

為何使用消息系統

  • 解耦
  • 在項目啟動之初來預測將來項目會碰到什麼需求,是極其困難的。消息系統在處理過程中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口。這允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。冗餘
  • 有些情況下,處理數據的過程會失敗。除非數據被持久化,否則將造成丟失。消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。許多消息隊列所採用的”插入-獲取-刪除”範式中,在把一個消息從隊列中刪除之前,需要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。擴展性
  • 因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。不需要改變代碼、不需要調節參數。擴展就像調大電力按鈕一樣簡單。靈活性 & 峰值處理能力
  • 在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見;如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。可恢復性
  • 系統的一部分組件失效時,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復後被處理。順序保證
  • 在大多使用場景下,數據處理的順序都很重要。大部分消息隊列本來就是排序的,並且能保證數據會按照特定的順序來處理。Kafka保證一個Partition內的消息的有序性。緩衝
  • 在任何重要的系統中,都會有需要不同的處理時間的元素。例如,加載一張圖片比應用過濾器花費更少的時間。消息隊列通過一個緩衝層來幫助任務最高效率的執行———寫入隊列的處理會盡可能的快速。該緩衝有助於控制和優化數據流經過系統的速度。異步通信
  • 很多時候,用戶不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但並不立即處理它。想向隊列中放入多少消息就放多少,然後在需要的時候再去處理它們。

常用Message Queue對比

  • RabbitMQ
  • RabbitMQ是使用Erlang編寫的一個開源的消息隊列,本身支持很多的協議:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量級,更適合於企業級的開發。同時實現了Broker構架,這意味著消息在發送給客戶端時先在中心隊列排隊。對路由,負載均衡或者數據持久化都有很好的支持。Redis
  • Redis是一個基於Key-Value對的NoSQL數據庫,開發維護很活躍。雖然它是一個Key-Value數據庫存儲系統,但它本身支持MQ功能,所以完全可以當做一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試數據分為128Bytes、512Bytes、1K和10K四個不同大小的數據。實驗表明:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而如果數據大小超過了10K,Redis則慢的無法忍受;出隊時,無論數據大小,Redis都表現出非常好的性能,而RabbitMQ的出隊性能則遠低於Redis。ZeroMQ
  • ZeroMQ號稱最快的消息隊列系統,尤其針對大吞吐量的需求場景。ZMQ能夠實現RabbitMQ不擅長的高級/複雜的隊列,但是開發人員需要自己組合多種技術框架,技術上的複雜度是對這MQ能夠應用成功的挑戰。ZeroMQ具有一個獨特的非中間件的模式,你不需要安裝和運行一個消息服務器或中間件,因為你的應用程序將扮演這個服務器角色。你只需要簡單的引用ZeroMQ程序庫,可以使用NuGet安裝,然後你就可以愉快的在應用程序之間發送消息了。
  • 但是ZeroMQ僅提供非持久性的隊列,也就是說如果宕機,數據將會丟失。其中,Twitter的Storm 0.9.0以前的版本中默認使用ZeroMQ作為數據流的傳輸(Storm從0.9版本開始同時支持ZeroMQ和Netty作為傳輸模塊)。ActiveMQ
  • ActiveMQ是Apache下的一個子項目。 類似於ZeroMQ,它能夠以代理人和點對點的技術實現隊列。同時類似於RabbitMQ,它少量代碼就可以高效地實現高級應用場景。Kafka/Jafka

Kafka是Apache下的一個子項目,是一個高性能跨語言分佈式發佈/訂閱消息隊列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。具有以下特性:

快速持久化,可以在O(1)的系統開銷下進行消息持久化;

高吞吐,在一臺普通的服務器上既可以達到10W/s的吞吐速率;

完全的分佈式系統,Broker、Producer、Consumer都原生自動支持分佈式,

自動實現負載均衡;支持Hadoop數據並行加載,對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka通過Hadoop的並行加載機制統一了在線和離線

的消息處理。Apache Kafka相對於ActiveMQ是一個非常輕量級的消息系統,除了性能非常好之外,還是一個工作良好的分佈式系統。

瞭解了kafka的基本情況,那麼kafka能解決什麼呢?

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

  1. Web應用:部署在雲服務器上,為個人電腦或者移動用戶提供的訪問體驗。
  2. SQL數據庫:為Web應用提供數據持久化以及數據查詢。
大數據實時項目必備技能二:kafka有話說

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

大數據實時項目必備技能二:kafka有話說

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

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

這時候就輪到Kafka出場了。

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

大數據實時項目必備技能二:kafka有話說

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

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

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

瞭解這些你對kafka也有了一個比較基礎的認識,下面給大家推薦兩本比較好的書,希望大家喜歡

大數據實時項目必備技能二:kafka有話說

Kafka核心作者和業界一流一線人員共同執筆

全面介紹Kafka設計原理和架構細節

本書是關於Kafka的全面教程,主要內容包括:Kafka相對於其他消息隊列系統的優點,主要是它如何完美匹配大數據平臺開發;詳解Kafka內部設計;用Kafka構建應用的最佳實踐;理解在生產中部署Kafka的最佳方式;如何確保Kafka集群的安全

大數據實時項目必備技能二:kafka有話說

Kafka自LinkedIn開源以來就以高性能、高吞吐量、分佈式的特性著稱,本書以0.10版本的源碼為基礎,深入分析了Kafka的設計與實現,包括生產者和消費者的消息處理流程,新舊消費者不同的設計方式,存儲層的實現,協調者和控制器如何確保Kafka集群的分佈式和容錯特性,兩種同步集群工具MirrorMaker和uReplicator,流處理的兩種API以及Kafka的一些高級特性等。

好啦,今天就分享這些,有不好的地方希望大家多多指教哦,還是老規矩,希望大家多多關注,你的一份關注就是我不斷努力的動力,也希望大家在忙碌的同時也要按時吃飯,照顧好自己。


分享到:


相關文章: