Kafka是一款開源的事件流軟件,它可以幫助你構(gòu)建基于事件驅(qū)動的系統(tǒng)。雖然有其他的學(xué)習指南,但是我更關(guān)注的是將Kafka背后的主要概念圖形化。這樣,當你閱讀其他指南時,你會感到更自信。
Basics
在我們開始之前,讓我們確保我們在關(guān)于Kafka的看法是一致的。 它是一款事件流軟件。 它讓后端服務(wù)(通常在微服務(wù)體系結(jié)構(gòu)中)彼此通信。

生產(chǎn)者和消費者
生產(chǎn)者和消費者是在Kafka中監(jiān)聽或發(fā)送消息的服務(wù)。這些服務(wù)是您的后端服務(wù)。

一個服務(wù)可以是生產(chǎn)者又可以是消費者。

主題(topic)
主題是生產(chǎn)者可以向其發(fā)送消息的地址。其他服務(wù)可以監(jiān)聽這些主題。

一個服務(wù)可以監(jiān)聽消息并發(fā)送消息到它想要的任意多個主題。

還有一個消費者組的概念。這是一組充當單一消費者的服務(wù)。

主題可以充當消息的隊列。讓我們來看看這個。首先,發(fā)送一條消息。

然后,該消息被記錄并存儲在該隊列中。此消息無法被修改的。

該消息也被發(fā)送給監(jiān)聽該主題的消費者。 但是,但是,該消息將永久保存在隊列中,不能進行修改。

讓我們發(fā)送另一個消息。只是為了再次強調(diào)一下。

與前面一樣,該消息將被發(fā)送到消費者并存儲在隊列中。您不能更改消息,它們將被永久存儲。

這是我們的Kafka集群中的每個主題。

這些不可變隊列允許我們異步存儲消息,而不管生產(chǎn)者或消費者是否出現(xiàn)故障。它還保證消息的正確性(它們沒有被篡改)。
讓我們剖開Kafka主題,看看內(nèi)部。
分區(qū)(Partitions)
我說謊了。一個Kafka主題并不是一個真正的隊列,而是由許多稱為分區(qū)的隊列組成的!

當生產(chǎn)者向主題發(fā)布消息時,該消息將被路由到單個分區(qū)。

消費者監(jiān)聽所有分區(qū)并接收所有分區(qū)的事件。

默認情況下,生產(chǎn)者將向主題發(fā)送消息。主題將確定消息將轉(zhuǎn)到哪個分區(qū)。默認情況下,消息將通過輪詢策略分配給分區(qū)。

您可以配置主題(而不是服務(wù))來將消息分割到不同的分區(qū)。例如,如果您正在處理用戶消息(并且有一個用戶id),那么您可以確保同一用戶的消息分配到同一個分區(qū)內(nèi)。您可以通過對用戶id進行hash計算,然后根據(jù)分區(qū)數(shù)對其進行計算(如:hash值/分區(qū)數(shù) )。你明白了吧。

這樣搞的好處是什么呢?好處在于分區(qū)中的每條消息都保證按時間順序排列,因此可以按順序消費。

進入該分區(qū)的每條消息都在該分區(qū)中排序。 即使有多個用戶(或其他實體)映射到相同的分區(qū)(紅色/綠色)。 您仍然可以為每個訂購用戶消息。

來自分區(qū)的消息將被排序。但是分區(qū)可以在任何時候發(fā)送它們的消息。因此,主題是不保證順序。這有點奇怪。我知道。下面,請注意兩個分區(qū)是如何發(fā)送它們自己的消息的。但它們是不考慮其他分區(qū)的。他們?nèi)匀槐3肿约旱南㈨樞颉?/p>

如果您的消費者依賴于消息順序(跟蹤站點內(nèi)的用戶單擊),那么您將希望深入研究這些主題分區(qū)策略(這超出了本文的討論范圍)。如果沒有這種需求,你可以使用默認策略。
現(xiàn)在讓我們再深入一點,了解一下Kafka是如何做到這一點的。
基礎(chǔ)架構(gòu)(Infrastructure)
如果我們退一步來看第一張圖表。什么是Kafka云。

它實際上是一組服務(wù)器。 我們將看到的第一個是Kafka群集的頭部zookeeper。

Zookeeper管理所有的主題和分區(qū)。它基維護了一組Kafka集群節(jié)點,在這些節(jié)點上存儲主題和分區(qū)。這些節(jié)點是組成Kafka集群的獨立機器(例如,EC2實例)。

如果我們有兩個主題,每個主題有兩個分區(qū),這可能是我們之前想象它們的方式。注意,現(xiàn)在分區(qū)的顏色與主題相同。

我們將給分區(qū)編號,以便稍后識別它們。

現(xiàn)在,讓我們看看這些主題如何適應(yīng)我們的Kafka集群。 讓我們從一個主題開始。 主題A.對于此示例,其分區(qū)#1將放在每個節(jié)點上。

您不必在每個節(jié)點上放置分區(qū)。 因為 它會變得昂貴。 另一方面,您將擁有一個有彈性的系統(tǒng)。 讓我們看看為什么。
如果有消息進來,則會將其路由到其中一個節(jié)點中的分區(qū),稱為領(lǐng)導(dǎo)者。 zookeeper為領(lǐng)導(dǎo)者分配。

Zookeeper將像以前一樣將消息發(fā)送給消費者。 它還將將消息復(fù)制到分區(qū)的其他副本,從節(jié)點。

現(xiàn)在,分區(qū)的每個副本都包含我們的消息! 如果一個節(jié)點拆卸或爆炸,Zookeeper將重新分配給不同的節(jié)點。

這是與我們添加的彼此分區(qū)相同的過程。我們現(xiàn)在將在我們的群集中保留兩個分區(qū)副本。

現(xiàn)在讓我們在另一個分區(qū)#2中添加主題A.它也只是兩個副本。 現(xiàn)在,主題A完全在我們的集群中! 兩個分區(qū)都被復(fù)制和維護。

現(xiàn)在,讓我們在主題B的分區(qū)中添加分區(qū)。我們現(xiàn)在假設(shè)兩個副本。 這是我們的Kafka集群與兩個主題! 我們已經(jīng)完成了!

比較一下我們以前的情況可能會有所幫助。注意主題是如何在集群中分布的。


結(jié)束語
我希望你現(xiàn)在對Kafka更好地了解。 我希望這些圖形化的東西能幫助你弄清楚你在google中要搜索的問題。
謝謝你的閱讀! 并且非常感謝Kafka創(chuàng)作者制作一個令人難以置信的平臺。
原文:https://timothystepro.medium.com/visualizing-kafka-20bc384803e7