1. 程式人生 > >為什麼你要使用這麼強大的分散式訊息中介軟體——kafka

為什麼你要使用這麼強大的分散式訊息中介軟體——kafka

為什麼是kafka?

在我們大量使用分散式資料庫、分散式計算叢集的時候,是否會遇到這樣的一些問題:

  1. 我們想分析下使用者行為(pageviews),以便我們設計出更好的廣告位

  2. 我想對使用者的搜尋關鍵詞進行統計,分析出當前的流行趨勢

  3. 有些資料,儲存資料庫浪費,直接儲存硬碟效率又低

這些場景都有一個共同點:
資料是由上游模組產生,上游模組,使用上游模組的資料計算、統計、分析,這個時候就可以使用訊息系統,尤其是分散式訊息系統!

知道了我們有必要在資料處理系統中使用一個訊息系統,但是我們為什麼一定要選kafka呢?現在的訊息系統可不只有kafka。

話說阿里中介軟體團隊和LinkedIn團隊都做了一個Kafka、RabbitMQ、RocketMQ的三者對比。這邊就不獻醜了,實際結果可以參考以下兩篇博文:

阿里測試:http://jm.taobao.org/2016/04/01/kafka-vs-rabbitmq-vs-rocketmq-message-send-performance/

LinkedIn測試:https://blog.csdn.net/SJF0115/article/details/78480433

Kafka簡介

Kafka是Linkedin於2010年12月份建立的開源訊息系統,它主要用於處理活躍的流式資料。活躍的流式資料在web網站應用中非常常見,這些活動資料包括頁面訪問量(Page View)、被檢視內容方面的資訊以及搜尋情況等內容。 這些資料通常以日誌的形式記錄下來,然後每隔一段時間進行一次統計分析。

傳統的日誌分析系統是一種離線處理日誌資訊的方式,但若要進行實時處理,通常會有較大延遲。而現有的訊息佇列系統能夠很好的處理實時或者近似實時的應用,但未處理的資料通常不會寫到磁碟上,這對於Hadoop之類,間隔時間較長的離線應用而言,在資料安全上會出現問題。Kafka正是為了解決以上問題而設計的,它能夠很好地進行離線和線上應用。

kafka部署結構

訊息佇列(Message Queue,簡稱MQ),從字面意思上看,本質是個佇列,FIFO先入先出,只不過佇列中存放的內容是message而已。其主要用途:不同程序Process/執行緒Thread之間通訊。

幾大特性

  • 高吞吐量:可以滿足每秒百萬級別訊息的生產和消費——生產消費。

  • 負載均衡:通過zookeeper對Producer,Broker,Consumer的動態加入與離開進行管理。

  • 拉取系統:由於kafka broker會持久化資料,broker沒有記憶體壓力,因此,consumer非常適合採取pull的方式消費資料

  • 動態擴充套件:當需要增加broker結點時,新增的broker會向zookeeper註冊,而producer及consumer會通過zookeeper感知這些變化,並及時作出調整。

  • 訊息刪除策略:資料檔案將會根據broker中的配置要求,保留一定的時間之後刪除。kafka通過這種簡單的手段,來釋放磁碟空間。

訊息收發流程

  • 啟動Zookeeper及Broker.

  • Producer連線Broker後,將訊息釋出到Broker中指定Topic上(可以指定Patition)。

  • Broker叢集接收到Producer發過來的訊息後,將其持久化到硬碟,並將訊息該保留指定時長(可配置),而不關注訊息是否被消費。

  • Consumer連線到Broker後,啟動訊息泵對Broker進行偵聽,當有訊息到來時,會觸發訊息泵迴圈獲取訊息,獲取訊息後Zookeeper將記錄該Consumer的訊息Offset。

Kafka服務

對於kafka而言,kafka服務就像是一個大的水池。不斷的生產、儲存、消費著各種類別的訊息。那麼kafka由何組成呢?

  • Broker : Kafka訊息伺服器,訊息中心。一個Broker可以容納多個Topic。

  • Producer :訊息生產者,就是向Kafka broker發訊息的客戶端。

  • Consumer :訊息消費者,向Kafka broker取訊息的客戶端。

  • Zookeeper :管理Producer,Broker,Consumer的動態加入與離開。

  • Topic :可以為各種訊息劃分為多個不同的主題,Topic就是主題名稱。Producer可以針對某個主題進行生產,Consumer可以針對某個主題進行訂閱。

  • Consumer Group: Kafka採用廣播的方式進行訊息分發,而Consumer叢集在消費某Topic時, Zookeeper會為該叢集建立Offset消費偏移量,最新Consumer加入並消費該主題時,可以從最新的Offset點開始消費。

  • Partition:Kafka採用對資料檔案切片(Partition)的方式可以將一個Topic可以分佈儲存到多個Broker上,一個Topic可以分為多個Partition。在多個Consumer併發訪問一個partition會有同步鎖控制。

有的時候,不光是燈紅酒綠的世界可以讓人沉迷,技術的世界也同樣如此。而且有的時候,技術的世界比前者更加可怕,它不但能讓你悄無聲息的陷入進去,還能讓你產生一種你很上進,你很努力的假象,以至於等到你恍然大悟那天,已經悔之晚矣。

所以大家一定要找準自己的方向,不能因為今天阿里招聘需求這麼寫就去學這些,明天看到一個技術很牛逼又去學那個。因此我給大家推薦一個Java架構群:895244712,裡面有最清晰的網際網路架構學習路線,更有具體的知識點講解,都是免費的學習資源,推薦給大家。

未來Kafka中介軟體

目前該中介軟體只完成了初級階段功能,很多功能都不完善不深入,隨著應用業務的拓展及Kafka未來版本功能支援。以Kafka訊息中介軟體為中心的大資料處理平臺還有很多工去實現。

一般在網際網路中所流動的資料由以下幾種型別:

  • 需要實時響應的交易資料,使用者提交一個表單,輸入一段內容,這種資料最後是存放在關係資料庫(Oracle, MySQL)中的,有些需要事務支援。

  • 活動流資料,準實時的,例如頁面訪問量、使用者行為、搜尋情況等。我們可以針對這些資料廣播、排序、個性化推薦、運營監控等。這種資料一般是前端伺服器先寫檔案,然後通過批量的方式把檔案倒到Hadoop(離線資料分析平臺)這種大資料分析器裡面,進行慢慢的分析。

  • 各個層面程式產生的日誌,例如http的日誌、tomcat的日誌、其他各種程式產生的日誌。這種資料一個是用來監控報警,還有就是用來做分析。