kafka作為一款開源的消息引擎系統,主要功能提供提供完備的消息釋出和訂閱的解決方案。它的消息傳遞屬性,就像引擎,具備某種轉化能量的能力。
根據維基百科的定義,kafka是一組消息規範,企業利用在這組規範在不同系統間,傳遞精确語義定義的消息,實作松耦合的異步式資料傳遞。
消息引擎最基礎的功能:傳遞對象是消息;如何傳遞消息。
支援兩種消息引擎模型:點對點;釋出訂閱模型。
消息引擎的作用:
削峰填谷:緩沖上下遊瞬時突發流量,使其平滑。一般,上遊的TPS高于下遊,使得下遊服務無法即時處理上遊消息。
讓兩個系統之間實作松耦合,較少不必要的系統互動。
專業術語解釋:
主題(Topic):釋出與訂閱的對象,可以為每個業務、每個應用、或者每類資料定義一個主題。
生産者(producer):向主題釋出消息的用戶端應用程式。
消費者(consumer):訂閱主題消息的用戶端應用程式。
生産者和消費者統稱為用戶端。
對應于用戶端,kafka的伺服器端由被稱為broker的服務程序構成。即一個kafka叢集由多個broker組成,每個broker負責接收和處理用戶端的請求,以及消息持久化。
高可用性:1. broker一般分布在多台機器上,這樣隻要有一台機器當機,其他機器仍可對外提供服務。
2. 備份機制:相同資料拷貝在不同機器,每個備份叫做副本,leader副本和follower副本。
副本工作機制:生産者向leader副本寫消息,消費者從leader副本讀消息,follower副本向leader副本發送請求,請求leader副本将消息發給它,以保持與上司者同步。
伸縮性:分區機制(partitioning),每個主題分為多個分區,每個分區是一組有序的消息日志,每條消息隻會被發送到一個分區。kafka分區編号從0開始,分區位移(offset)也是從0開始。
kafka的三層消息架構:
主題層:每個主題分為多個分區,每個分區有多個副本。
分區層:每個分區的多個副本,隻能有一個leader,對外提供服務,其他的是follower,提供資料備援之用。
消息層:每個分區由若幹消息組成, 消息位移從0開始。
怎樣持久化資料:kafka使用消息日志儲存消息,一個消息日志就是磁盤上隻能被追加寫的實體檔案。追加寫,避免了緩慢的随機IO操作,改為性能較好的順序IO寫操作(高吞吐量的手段之一)。每個消息日志,進一步分為多個日志段,消息被追加寫道目前最新日志段,寫滿即封存,開啟新的日志段。kafka在後天定期檢查老的日志段,過期的就删除,實作磁盤空間回收。
kafka實作點對點模型是通過消費者組機制,多個消費者執行個體構成一個消費者組,消費一個主題,其中主題的每個分區隻能被一個消費者執行個體消費。這樣,多個消費者執行個體同時消費消息,增加了消費端的吞吐量(TPS)。
消費者組中的執行個體不僅可以瓜分訂閱主題的資料,還彼此協助,即當某個消費者執行個體挂掉,kafka自動檢測,把挂掉消費者執行個體消費的分區轉移給其他的分區。被稱為重平衡(rebalance)。
kafka僅僅是消息引擎嗎?
kafka設計之初,旨在提供三方面特性:提供一套API實作生産者和消費者;降低網絡傳輸和磁盤存儲開銷;實作高伸縮性架構。
apache kafka 是消息引擎系統,也是分布式流處理平台。與其他主流大資料流式計算架構,有兩點優勢:端到端的正确性;對于自己流式計算的定位。
另外,kafka還可以用作分布式存儲系統。
kafka組織:apache kafka; confluent kafka; CDH kafka和HDP kafka。
如果僅僅需要一個消息引擎系統亦或簡單的流處理應用場景,同時需要對系統有較大的把控度,推薦使用apache kafka;
如果需要kafka的一些進階特性,推薦使用confluent kafka;
如果需要快速搭建消息引擎系統,或者需要建構多架構構成的資料平台且kafka隻是其中一個元件,推薦使用第三者。
kafka版本演進:
比如:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxkleOJTTE5EMJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1AzMzETN0ETMyATOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
kafka_2.11-2.1.1,真正版本号2.1.1, 2-大版本号,major version,中間的1-小版本号,minor version, 後面的1-修訂版本号,patch号。“大版本号-小版本号-Patch号”。
kafka目前演進了7個大版本,0.7、0.8、0.9、0.10、0.11、1.0、2.0。
0.7版本:隻提供基礎的消息隊列功能,連基本的副本機制都沒有。
0.8版本:引入副本機制,成為一個真正意義的完備的分布式高可靠消息隊列解決方案。使用的是老版本的用戶端API,在開發生産者和消費者,需指定Zookeeper位址而非Broker位址。在0.8.2.0中開始引入新版本Producer API,需指定Broker位址的Producer。如果還在用0.8.1.1、0.8.2,建議更新到0.8.2.2,消費者API比較穩定,但不要用新版本Producer API。
0.9.0.0:增加了基礎的安全認證/權限功能,同時使用JAVA重寫了新版本消費者API,還引入了kafka connect元件(實作高性能的資料抽取)。新版本的Producer API比較穩定,但不要使用新版本consumer API。
0.10.0.0:引入kafka streams,kafka正式更新為分布式流處理平台,但還基本不能線上部署。新版本的consumer API比較穩定。
0.11.0.0:提供幂等性Producer API,以及事務API,對kafka消息格式重構。
1.0和2.0:主要在kafka streams的各種改進。在消息引擎方面并未有太多變化。
建議:盡量保證伺服器端和用戶端版本一緻,否則會損失很多性能優化效益。
标注:這個系列文章是本人在極客時間專欄---kafka核心技術與實戰中的學習筆記
https://time.geekbang.org/column/article/101171