2020-01-18-kafka

kafka是什么?

Kafka 是一個廣受歡迎的流式處理平臺田柔。你可以認(rèn)為它是一個專門用于將信息從一個地方放置到另一個地方的服務(wù)全景。它能幫助你在眾多服務(wù)間構(gòu)建異步事件處理模型耀石,創(chuàng)建生產(chǎn)-消費(fèi)機(jī)制或者均衡地分布式作業(yè) - 這方面的案例多不勝數(shù)。

無論出于何種目的而使用kafka爸黄,你都有必要了解一些kafka的基礎(chǔ)理論娶牌。

生產(chǎn)者和消費(fèi)者

kafka包含生產(chǎn)者和消費(fèi)者的概念,前者推送消息到kafka馆纳,而后者從kafka獲取這些消息诗良。

由于有各種各樣的消息數(shù)據(jù)通過kafka被處理,因此為了將它們分類理順鲁驶,kafka允許你為不同類型的消息創(chuàng)建獨(dú)立的處理上下文鉴裹,即以主題(topics)的形式將消息進(jìn)行分組。

每一個試圖推送消息的生產(chǎn)者都必須為消息提供一個topic名稱钥弯。

此外径荔,消費(fèi)者也會訂閱一系列的topics()繼而可以從這些topics中消費(fèi)消息

kafka consumers and producers

消費(fèi)者組

在現(xiàn)實(shí)場景中,你想要每個感興趣的服務(wù)從某個特定的topic接收每一條消息脆霎,同時你希望你的消息精確地遞送至每個服務(wù)的某個實(shí)例总处;這是消費(fèi)者組就可以登場了。

最根本的睛蛛,如果你想將一類消息分發(fā)給一群消費(fèi)者處理或者將這些消費(fèi)和其他組的消費(fèi)者區(qū)分開來鹦马, 你會將這些消費(fèi)者添加到一個消費(fèi)者組。

每個topic中的每條消息會被遞送到每個消費(fèi)者組忆肾,但在消費(fèi)者組內(nèi)晦炊,單條消息只會被某一個消費(fèi)者處理(組內(nèi)其他的消費(fèi)對這條消息是無感的)蹂风。

從下圖中也可以看到扒最,每條消息會終結(jié)于每個消費(fèi)者組中的某個特定消費(fèi)者赏殃。

kafka consumer groups

分區(qū)

現(xiàn)在讓我們聚焦到單個的消費(fèi)者組中。假設(shè)你有一個叫作EmailGroup的組,該組包含3個消費(fèi)者和悦;那么kafka會將消息投遞至哪個消費(fèi)者呢退疫?

事實(shí)上,每個topic被劃分為了多個分區(qū)鸽素,分區(qū)是整個topic的一個數(shù)據(jù)分塊蹄咖,一條消息只會出現(xiàn)在其中一個分區(qū)上。

生產(chǎn)者生產(chǎn)的消息包含鍵和值兩部分付鹿;值就是你想投遞的數(shù)據(jù)澜汤,鍵也可以用來傳遞信息,但它更適合用來作分區(qū)鍵舵匾,生產(chǎn)者會將該鍵進(jìn)行hash俊抵,以確定將對應(yīng)的消息發(fā)往哪個分區(qū)。這就意味著坐梯,如果你想發(fā)送兩條不同的消息到相同的分區(qū)徽诲,那么你得為它們設(shè)置同樣的鍵。

很好吵血,目前為止谎替,我們知道了生產(chǎn)者如何與分區(qū)協(xié)同,但是消費(fèi)者方面呢蹋辅?

消費(fèi)者將會訂閱一個topic(加入消費(fèi)者組是必然的)并且拉取它所對應(yīng)的分區(qū)中的消息钱贯。這兒最重要的概念是每個分區(qū)必然被確定的單個消費(fèi)者消費(fèi),而每個消費(fèi)者則能夠訂閱多個分區(qū)(也可能0個分區(qū)侦另,比如消費(fèi)者數(shù)量大于分區(qū)數(shù)量)秩命。

kafka partitions

聚焦至分區(qū),你會看到kafka是可以保證單個分區(qū)消息有序的褒傅。假設(shè)有條消息A(鍵為阿勇)被發(fā)送到一個topic弃锐,之后有一條消息B(鍵也為阿勇)也發(fā)送到該topic;然后消費(fèi)者將會依次先接收到A然后是B殿托,當(dāng)然這種順序僅對單個分區(qū)有效霹菊,不同分區(qū)的消息將以不確定的順序被消費(fèi)。

實(shí)際上支竹,分區(qū)只是一個僅允許往后追加的日志旋廷,這也是保證順序的原因。另一方面唾戚,不同的分區(qū)是不同的數(shù)據(jù)分片(日志)柳洋,因此無法保證順序待诅。

作為圖形化的解釋叹坦,這里生產(chǎn)者發(fā)布了3條消息——A、B和C——都具有相同的鍵卑雁。分區(qū)看起來是這樣的:

kafka order

如果消費(fèi)者現(xiàn)在訂閱了這個主題募书,并且被分配到這個分區(qū)绪囱,那么它將首先接收UserCreatedA,然后是UserCreatedB莹捡,最后是UserCreatedC鬼吵。

Offset

現(xiàn)在你可能會問:“我的應(yīng)用如何追蹤哪條消息已經(jīng)被消費(fèi),接著是哪條消息將被拉壤河齿椅?”,由于在kafka中消息日志是線性結(jié)構(gòu)启泣,分區(qū)中每條消息都被分配了確定的offset(位移偏量),比如分區(qū)中第一條消息offset記作0寥茫,嚇一條記作1遣蚀,以此類推。

基于以上原理纱耻,kafka中每條消息能夠通過topic名稱芭梯,分區(qū)號和offset作唯一標(biāo)定。

消費(fèi)者使用offsets來指定它在一個log中的消費(fèi)位置玖喘。事實(shí)上,offsets存在兩種蘑志,一種是在kafka中可持久化的用于在消費(fèi)者崩潰時作為消費(fèi)存根芒涡,另一種是在消費(fèi)者端本地存儲用于協(xié)調(diào)持續(xù)的消息輪詢。

已提交的offset

第一種偏移量是提交偏移量卖漫,它用于在消費(fèi)者崩潰時標(biāo)記該消費(fèi)者最后的消費(fèi)點(diǎn)费尽。

比如,有個新啟動的消費(fèi)者要消費(fèi)一個新的topic羊始,它從offset-0拉取了10條消息旱幼;消息被處理后,消費(fèi)者想標(biāo)記消息為“已消費(fèi)”并通知kafka突委,這個過程叫作“提交”柏卤,簡而言之,消費(fèi)者想要告訴集群記住它已經(jīng)消費(fèi)到位置offset-10了匀油。

現(xiàn)在缘缚,即使服務(wù)端/消費(fèi)者宕機(jī),在恢復(fù)后敌蚜,新的消費(fèi)者接入進(jìn)分區(qū)同樣可以從offset-10之后繼續(xù)消費(fèi)桥滨。

提交的offset被持久化到Kafka中,只有通過提交才能更改。使用者在連接到集群時獲取此offset齐媒,以了解前一個消費(fèi)者已消費(fèi)到何處蒲每。

消費(fèi)端offset

你或許會問,當(dāng)你拉取消息的時候使用哪個offset喻括?是已提交的那個邀杏?看下面的代碼,對poll方法連續(xù)調(diào)用了兩次唬血,但是中間卻沒有commit操作望蜡。你會期待第二次調(diào)用poll得到什么?

val anyTimeout = 100

consumer.poll()
consumer.poll()

您當(dāng)然希望代碼會繼續(xù)執(zhí)行拷恨,所以第二次poll應(yīng)該會返回下一批消息泣特,對嗎?事實(shí)卻是如此挑随。代碼背后状您,消費(fèi)者記住了一個叫作position的東西;每次您調(diào)用poll并確定下一條要獲取的消息時兜挨,它都會增加膏孟,而與此同時,如果您調(diào)用某個提交方法拌汇,offset則會被提交柒桑。

通過調(diào)用以下方法中的一個,你能改變消費(fèi)者的position:

consumer.seek(somePartition, newOffset)
consumer.seekToBeginning(somePartitions)
consumer.seekToEnd(somePartitions)

最后噪舀,初始o(jì)ffset是多少呢魁淳?如果你新建了一個消費(fèi)者組,剛開始不會有提交的offset与倡。

kafka允許你選擇一個策略界逛,記住這個策略設(shè)置只會在沒有產(chǎn)生已提交offset時才會生效,否則如何已提交offset已經(jīng)存在纺座,kafka將會使用該offset息拜;

可選的策略如下:

  • Earliest - 偏移量將設(shè)置為可用的最低/最早偏移量
  • Lastest - 偏移量將設(shè)置為可用的最大/最新偏移量
  • None - 將拋出異常,因此可以手動處理

balabala

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末净响,一起剝皮案震驚了整個濱河市少欺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馋贤,老刑警劉巖赞别,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異配乓,居然都是意外死亡仿滔,警方通過查閱死者的電腦和手機(jī)惠毁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堤撵,“玉大人仁讨,你說我怎么就攤上這事羽莺∈底颍” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵盐固,是天一觀的道長荒给。 經(jīng)常有香客問我,道長刁卜,這世上最難降的妖魔是什么志电? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蛔趴,結(jié)果婚禮上挑辆,老公的妹妹穿的比我還像新娘。我一直安慰自己孝情,他們只是感情好鱼蝉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箫荡,像睡著了一般魁亦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羔挡,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天洁奈,我揣著相機(jī)與錄音,去河邊找鬼绞灼。 笑死利术,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的低矮。 我是一名探鬼主播氯哮,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼商佛!你這毒婦竟也來了喉钢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤良姆,失蹤者是張志新(化名)和其女友劉穎肠虽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玛追,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡税课,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年闲延,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韩玩。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡垒玲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出找颓,到底是詐尸還是另有隱情合愈,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布击狮,位于F島的核電站佛析,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏彪蓬。R本人自食惡果不足惜寸莫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望档冬。 院中可真熱鬧膘茎,春花似錦、人聲如沸酷誓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呛牲。三九已至刮萌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娘扩,已是汗流浹背着茸。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琐旁,地道東北人涮阔。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像灰殴,于是被迫代替她去往敵國和親敬特。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容