一.介紹
kafka是一個分布式消息系統,由linkedin使用scala編寫,用作LinkedIn的活動流(Activity Stream)和運營數據處理管道(Pipeline)的基礎。具有高水平擴展和高吞吐量。
特點:
- 提供Pub/Sub方式的海量消息處理。
- 以高容錯的方式存儲海量數據流。
- 保證數據流的順序。
Kafka提供了類JMS的特性,但在設計實現上並不遵循JMS規范,Kafka對消息保存時根據Topic進行歸類,發送消息者稱為Producer,消息接受者稱為Consumer,此外kafka集群有多個kafka實例組成,每個實例(server)稱為broker。同時無論是kafka集群,還是producer和consumer都依賴於zookeeper集群保存一些meta信息,來保證系統可用性。
Kafka核心組件及簡單的運作流程圖:
Topic :消息根據Topic進行歸類
Producer:發送消息者
Consumer:消息接受者
Kafka cluster:kafka集群
broker:每個kafka實例(server)
Zookeeper:依賴集群保存meta信息
二.使用場景
假設你意氣風發,要開發新一代的互聯網應用,以期在互聯網事業中一展宏圖。借助雲計算,很容易開發出如下原型系統:
- Web應用:部署在雲服務器上,為個人電腦或者移動用戶提供的訪問體驗。
- SQL數據庫:為Web應用提供數據持久化以及數據查詢。
這套架構簡潔而高效,很快便能夠部署到百度雲等雲計算平台,以便快速推向市場。互聯網不就是講究小步快跑嘛!
好景不長。隨着用戶的迅速增長,所有的訪問都直接通過SQL數據庫使得它不堪重負,不得不加上緩存服務以降低SQL數據庫的荷載;
為了理解用戶行為,開始收集日志並保存到Hadoop上離線處理,同時把日志放在全文檢索系統中以便快速定位問題;由於需要給投資方看業務狀況,也需要把數據匯總到數據倉庫中以便提供交互式報表。此時的系統的架構已經盤根錯節了,考慮將來還會加入實時模塊以及外部數據交互,真是痛並快樂着……
這時候,應該跑慢一些,讓靈魂跟上來。
本質上,這是一個數據集成問題。沒有任何一個系統能夠解決所有的事情,所以業務數據根據不同用途存而放在不同的系統,比如歸檔、分析、搜索、緩存等。數據冗余本身沒有任何問題,但是不同系統之間像意大利面條一樣復雜的數據同步卻是挑戰。
這時候就輪到Kafka出場了。
Kafka可以讓合適的數據以合適的形式出現在合適的地方。Kafka的做法是提供消息隊列,讓生產者單往隊列的末尾添加數據,讓多個消費者從隊列里面依次讀取數據然后自行處理。之前連接的復雜度是O(N^2),而現在降低到O(N),擴展起來方便多了:
在Kafka的幫助下,你的互聯網應用終於能夠支撐飛速增長的業務,成為下一個BAT指日可待。
以上故事說明了Kafka主要用途是數據集成,或者說是流數據集成,以Pub/Sub形式的消息總線形式提供。但是,Kafka不僅僅是一套傳統的消息總線,本質上Kafka是分布式的流數據平台。
三.舉例說明
生產者消費者,生產者生產雞蛋,消費者消費雞蛋,生產者生產一個雞蛋,消費者就消費一個雞蛋,假設消費者消費雞蛋的時候噎住了(系統宕機了),生產者還在生產雞蛋,那新生產的雞蛋就丟失了。再比如生產者很強勁(大交易量的情況),生產者1秒鍾生產100個雞蛋,消費者1秒鍾只能吃50個雞蛋。
那要不了一會,消費者就吃不消了(消息堵塞,最終導致系統超時),消費者拒絕再吃了,”雞蛋“又丟失了,這個時候我們放個籃子在它們中間,生產出來的雞蛋都放到籃子里,消費者去籃子里拿雞蛋,這樣雞蛋就不會丟失了,都在籃子里。
而這個籃子就是”kafka“。雞蛋其實就是“數據流”,系統之間的交互都是通過“數據流”來傳輸的(就是tcp、http什么的),也稱為報文,也叫“消息”。消息隊列滿了,其實就是籃子滿了,”雞蛋“ 放不下了,那趕緊多放幾個籃子,其實就是kafka的擴容。各位現在知道kafka是干什么的了吧,它就是那個"籃子"
四.基本概念
消費者:(Consumer):從消息隊列中請求消息的客戶端應用程序
生產者:(Producer) :向broker發布消息的應用程序
AMQP服務端(broker):用來接收生產者發送的消息並將這些消息路由給服務器中的隊列,便於fafka將生產者發送的消息,動態的添加到磁盤並給每一條消息一個偏移量,所以對於kafka一個broker就是一個應用程序的實例
主題(Topic):一個主題類似新聞中的體育、娛樂、教育等分類概念,在實際工程中通常一個業務一個主題。
分區(Partition):一個Topic中的消息數據按照多個分區組織,分區是kafka消息隊列組織的最小單位,一個分區可以看作是一個FIFO( First Input First Output的縮寫,先入先出隊列)的隊列。
kafka分區是提高kafka性能的關鍵所在,當你發現你的集群性能不高時,常用手段就是增加Topic的分區,分區里面的消息是按照從新到老的順序進行組織,消費者從隊列頭訂閱消息,生產者從隊列尾添加消息。
備份(Replication):為了保證分布式可靠性,kafka0.8開始對每個分區的數據進行備份(不同的Broker上),防止其中一個Broker宕機造成分區上的數據不可用。
kafka0.7是一個很大的改變:1、增加了備份2、增加了控制借點概念,增加了集群領導者選舉 。