❶ 3分鍾帶你徹底搞懂 Kafka
Kafka到底是個啥?用來幹嘛的?
官方定義如下:
翻譯過來,大致的意思就是,這是一個實時數據處理系統,可以橫向擴展,並高可靠!
實時數據處理 ,從名字上看,很好理解,就是將數據進行實時處理,在現在流行的微服務開發中,最常用實時數據處理平台有 RabbitMQ、RocketMQ 等消息中間件。
這些中間件,最大的特點主要有兩個:
在早期的 web 應用程序開發中,當請求量突然上來了時候,我們會將要處理的數據推送到一個隊列通道中,然後另起一個線程來不斷輪訓拉取隊列中的數據,從而加快程序的運行效率。
但是隨著請求量不斷的增大,並且隊列通道的數據一致處於高負載,在這種情況下,應用程序的內存佔用率會非常高,稍有不慎,會出現內存不足,造成程序內存溢出,從而導致服務不可用。
隨著業務量的不斷擴張,在一個應用程序內,使用這種模式已然無法滿足需求,因此之後,就誕生了各種消息中間件,例如 ActiveMQ、RabbitMQ、RocketMQ等中間件。
採用這種模型,本質就是將要推送的數據,不在存放在當前應用程序的內存中,而是將數據存放到另一個專門負責數據處理的應用程序中,從而實現服務解耦。
消息中間件 :主要的職責就是保證能接受到消息,並將消息存儲到磁碟,即使其他服務都掛了,數據也不會丟失,同時還可以對數據消費情況做好監控工作。
應用程序 :只需要將消息推送到消息中間件,然後啟用一個線程來不斷從消息中間件中拉取數據,進行消費確認即可!
引入消息中間件之後,整個服務開發會變得更加簡單,各負其責。
Kafka 本質其實也是消息中間件的一種,Kafka 出自於 LinkedIn 公司,與 2010 年開源到 github。
LinkedIn 的開發團隊,為了解決數據管道問題,起初採用了 ActiveMQ 來進行數據交換,大約是在 2010 年前後,那時的 ActiveMQ 還遠遠無法滿足 LinkedIn 對數據傳遞系統的要求,經常由於各種缺陷而導致消息阻塞或者服務無法正常訪問,為了能夠解決這個問題,LinkedIn 決定研發自己的消息傳遞系統, Kafka 由此誕生 。
在 LinkedIn 公司,Kafka 可以有效地處理每天數十億條消息的指標和用戶活動跟蹤,其強大的處理能力,已經被業界所認可,並成為大數據流水線的首選技術。
先來看一張圖, 下面這張圖就是 kafka 生產與消費的核心架構模型 !
如果你看不懂這些概念沒關系,我會帶著大家一起梳理一遍!
簡而言之,kafka 本質就是一個消息系統,與大多數的消息系統一樣,主要的特點如下:
與 ActiveMQ、RabbitMQ、RocketMQ 不同的地方在於,它有一個**分區 Partition **的概念。
這個分區的意思就是說,如果你創建的 topic 有5個分區,當你一次性向 kafka 中推 1000 條數據時,這 1000 條數據默認會分配到 5 個分區中,其中每個分區存儲 200 條數據。
這樣做的目的,就是方便消費者從不同的分區拉取數據,假如你啟動 5 個線程同時拉取數據,每個線程拉取一個分區,消費速度會非常非常快!
這是 kafka 與其他的消息系統最大的不同!
和其他的中間件一樣,kafka 每次發送數據都是向 Leader 分區發送數據,並順序寫入到磁碟,然後 Leader 分區會將數據同步到各個從分區 Follower ,即使主分區掛了,也不會影響服務的正常運行。
那 kafka 是如何將數據寫入到對應的分區呢?kafka中有以下幾個原則:
與生產者一樣,消費者主動的去kafka集群拉取消息時,也是從 Leader 分區去拉取數據。
這里我們需要重點了解一個名詞: 消費組 !
考慮到多個消費者的場景,kafka 在設計的時候,可以由多個消費者組成一個消費組,同一個消費組者的消費者可以消費同一個 topic 下不同分區的數據,同一個分區只會被一個消費組內的某個消費者所消費,防止出現重復消費的問題!
但是不同的組,可以消費同一個分區的數據!
你可以這樣理解,一個消費組就是一個客戶端,一個客戶端可以由很多個消費者組成,以便加快消息的消費能力。
但是,如果一個組下的消費者數量大於分區數量,就會出現很多的消費者閑置。
如果分區數量大於一個組下的消費者數量,會出現一個消費者負責多個分區的消費,會出現消費性能不均衡的情況。
因此,在實際的應用中,建議消費者組的 consumer 的數量與 partition 的數量保持一致!
光說理論可沒用,下面我們就以 centos7 為例,介紹一下 kafka 的安裝和使用。
kafka 需要 zookeeper 來保存服務實例的元信息,因此在安裝 kafka 之前,我們需要先安裝 zookeeper。
zookeeper 安裝環境依賴於 jdk,因此我們需要事先安裝 jdk
下載zookeeper,並解壓文件包
創建數據、日誌目錄
配置zookeeper
重新配置 dataDir 和 dataLogDir 的存儲路徑
最後,啟動 Zookeeper 服務
到官網 http://kafka.apache.org/downloads.html 下載想要的版本,我這里下載是最新穩定版 2.8.0 。
按需修改配置文件 server.properties (可選)
server.properties 文件內容如下:
其中有四個重要的參數:
可根據自己需求修改對應的配置!
啟動 kafka 服務
創建一個名為 testTopic 的主題,它只包含一個分區,只有一個副本:
運行 list topic 命令,可以看到該主題。
輸出內容:
Kafka 附帶一個命令行客戶端,它將從文件或標准輸入中獲取輸入,並將其作為消息發送到 Kafka 集群。默認情況下,每行將作為單獨的消息發送。
運行生產者,然後在控制台中鍵入一些消息以發送到伺服器。
輸入兩條內容並回車:
Kafka 還有一個命令行使用者,它會將消息轉儲到標准輸出。
輸出結果如下:
本文主要圍繞 kafka 的架構模型和安裝環境做了一些初步的介紹,難免會有理解不對的地方,歡迎網友批評、吐槽。
由於篇幅原因,會在下期文章中詳細介紹 java 環境下 kafka 應用場景!