《吃透 MQ 系列》之扒開 Kafka 的神秘面紗

廢話不多說了,第二彈開始發(fā)車。
01 為什么從 Kafka 開始?

第三,Kafka 其實是一個輕量級的 MQ,它具備 MQ 最基礎(chǔ)的能力,但是在延遲隊列、重試機(jī)制等高級特性上并未做支持,因此降低了實現(xiàn)復(fù)雜度。從 Kafka 入手,有利于大家快速掌握 MQ 最核心的東西。
02 扒開 Kafka 的面紗
在深入分析一門技術(shù)之前,不建議上來就去了解架構(gòu)以及技術(shù)細(xì)節(jié),而是先弄清楚它是什么?它是為了解決什么問題而產(chǎn)生的?
掌握這些背景知識后,有利于我們理解它背后的設(shè)計考慮以及設(shè)計思想。
在寫這篇文章時,我查閱了很多資料,關(guān)于 Kafka 的定義可以說五花八門,不仔細(xì)推敲很容易懵圈,我覺得有必要帶大家捋一捋。
我們先看看 Kafka 官網(wǎng)給自己下的定義:
Apache Kafka is an open-source distributed event streaming platform.
Kafka 最開始其實是 Linkedin 內(nèi)部孵化的項目,在設(shè)計之初是被當(dāng)做「數(shù)據(jù)管道」,用于處理以下兩種場景:
1、運營活動場景:記錄用戶的瀏覽、搜索、點擊、活躍度等行為。
2、系統(tǒng)運維場景:監(jiān)控服務(wù)器的 CPU、內(nèi)存、請求耗時等性能指標(biāo)。
可以看到這兩種數(shù)據(jù)都屬于日志范疇,特點是:數(shù)據(jù)實時生產(chǎn),而且數(shù)據(jù)量很大。
Linkedin 最初也嘗試過用 ActiveMQ 來解決數(shù)據(jù)傳輸問題,但是性能無法滿足要求,然后才決定自研 Kafka。
所以從一開始,Kafka 就是為實時日志流而生的。了解了這個背景,就不難理解 Kafka 與流數(shù)據(jù)的關(guān)系了,以及 Kafka 為什么在大數(shù)據(jù)領(lǐng)域有如此廣泛的應(yīng)用?也是因為它最初就是為解決大數(shù)據(jù)的管道問題而誕生的。
接著再解釋下:為什么 Kafka 被官方定義成流處理平臺呢?它不就提供了一個數(shù)據(jù)通道能力嗎,怎么還和平臺扯上關(guān)系了?
1、Kafka Streams:一個輕量化的流計算庫,性質(zhì)類似于 Spark、Flink。
2、Kafka Connect:一個數(shù)據(jù)同步工具,能將 Kafka 中的數(shù)據(jù)導(dǎo)入到關(guān)系數(shù)據(jù)庫、Hadoop、搜索引擎中。
可見 Kafka 的野心不僅僅是一個消息系統(tǒng),它早就在往「實時流處理平臺」方向發(fā)展了。
1、數(shù)據(jù)的發(fā)布和訂閱能力(消息隊列)
2、數(shù)據(jù)的分布式存儲能力(存儲系統(tǒng))
3、數(shù)據(jù)的實時處理能力(流處理引擎)
03 從 Kafka的消息模型說起
下面我們嘗試分析下 Kafka 的消息模型,看看它究竟是如何演化來的?

緊接著問題出現(xiàn)了:來一條消息,就廣播給所有消費者,但并非每個消費者都想要全部的消息,比如消費者 A 只想要消息1、2、3,消費者 B 只想要消息4、5、6,這時候該怎么辦呢?

這個問題的關(guān)鍵點在于:MQ 不理解消息的語義,它根本無法做到對消息進(jìn)行分類投遞。
此時,MQ 想到了一個很聰明的辦法:它將難題直接拋給了生產(chǎn)者,要求生產(chǎn)者在發(fā)送消息時,對消息進(jìn)行邏輯上的分類,因此就演進(jìn)出了我們熟知的 Topic 以及發(fā)布-訂閱模型。


如果采用傳統(tǒng)的隊列模式(單播),那當(dāng)一個消費者從隊列中取走消息后,這條消息就會被刪除,另外一個消費者就拿不到了。

這時候,就有了 Kafka 最畫龍點睛的一個解法:它將所有消息進(jìn)行了持久化存儲,由消費者自己各取所需,想取哪個消息,想什么時候取都行,只需要傳遞一個消息的 offset 即可。


04 寫在最后
希望大家有所收獲,下篇文章將會深入分析 Kafka 的架構(gòu)設(shè)計,我們下期見!
大家好,我是武哥,前亞馬遜工程師,現(xiàn)大廠技術(shù)總監(jiān),持續(xù)分享個人的成長收獲,關(guān)注我一定能提升你的視野,讓我們一起進(jìn)階吧!
