Kafka是開(kāi)源事件流軟件,可允許您構(gòu)建事件驅(qū)動(dòng)系統(tǒng)。雖然有其他指南,但我希望專注于可視化Kafka背后的主要概念。這樣,當(dāng)你閱讀其他指南時(shí),你會(huì)感到更自信。
有那個(gè),讓我們開(kāi)始!
基本
在我們開(kāi)始之前,讓我們確保我們?cè)陉P(guān)于Kafka的同一頁(yè)面上。它是事件流軟件。它允許后端服務(wù)(通常在微服務(wù)體系結(jié)構(gòu)中)彼此通信。

> Two services communicating via Kafka
生產(chǎn)者和消費(fèi)者
生產(chǎn)者和消費(fèi)者是在Kafka中傾聽(tīng)或發(fā)送消息的服務(wù)。這些服務(wù)是您的后端服務(wù)。

> Consumer and Producer
服務(wù)可以是消費(fèi)者和生產(chǎn)者。

> A service listening to messages and consuming them
主題 Topic
主題是生產(chǎn)者可以發(fā)送消息的地址。其他服務(wù)可以傾聽(tīng)這些主題。

> A service emitting a message and a service receiving a message from a Kafka topic
服務(wù)可以偵聽(tīng)并將消息發(fā)送到盡可能多的主題。

還有一個(gè)消費(fèi)者組的概念。這是一組充當(dāng)單一消費(fèi)者的服務(wù)。

> A consumer group listening to topic B
對(duì)于任何用于消費(fèi)者組的消息,Kafka將該消息路由到單個(gè)服務(wù)。這有助于您加載平衡消息。和規(guī)模消費(fèi)者!

> A message going into a single service with a consumer group
一個(gè)主題充當(dāng)郵件的隊(duì)列。讓我們走這一點(diǎn)。首先,發(fā)送消息。

> Producer sending message to Kafka topic.
然后,將記錄并存儲(chǔ)在此隊(duì)列中的消息。此消息無(wú)法更改。

> Message getting stored on the queue
該消息也被發(fā)送給主題的任何消費(fèi)者。但是,該消息永久且無(wú)法編輯隊(duì)列。

> A copy of the message being stored on the queue and sent to consumer.
讓我們發(fā)送另一條消息。只是為了回家。

> Sending a second message to Topic A
就像以前一樣,此消息將被發(fā)送到消費(fèi)者并存儲(chǔ)在隊(duì)列中。您無(wú)法更改消息,它們將永久存儲(chǔ)。
(P.S.如果有太多或經(jīng)過(guò)一段時(shí)間),您可以配置Kafka主題以刪除這些消息)

> Second message being stored.
這是我們的Kafka集群中的每個(gè)主題

> Messages being queued up in topics
這些不可變的隊(duì)列允許我們異步地存儲(chǔ)消息,無(wú)論生產(chǎn)者或消費(fèi)者是否下降。它還保證了消息的正確性(它們是不可替代的)。
讓我們開(kāi)辟這些Kafka主題,看看內(nèi)部。
分區(qū)
我撒了謊。一個(gè)Kafka主題不是一個(gè)隊(duì)列,而是實(shí)際組成了許多名為Partitions的隊(duì)列!他們幫助一個(gè)主題規(guī)模。

> A topic with two partitions
當(dāng)一個(gè)生產(chǎn)者帖子到一個(gè)主題時(shí),該消息被路由到單個(gè)分區(qū)。

> A message entering a topic, going to a partition
消費(fèi)者會(huì)聽(tīng)取所有分區(qū)并消耗所有人的事件。

> A message being consumed from a partition
默認(rèn)情況下的生產(chǎn)者將為主題發(fā)送消息。主題將確定消息將轉(zhuǎn)到哪些分區(qū)。默認(rèn)情況下,將通過(guò)循環(huán)策略分配消息。

> A producer writing to a topic, which is writing to multiple partitions
您可以配置主題(不是服務(wù))以將消息拆分為不同的分區(qū)。例如,如果您正在處理用戶消息(并且具有用戶ID),則可以確保該用戶留在同一分區(qū)內(nèi)的消息。您可以通過(guò)散列用戶ID來(lái)執(zhí)行此操作,然后通過(guò)分區(qū)的數(shù)量調(diào)制它。你明白了。我希望。

> A producer sending messages (with possibly different entity/user ids) to different partitions
你為什么要這個(gè)?這是因?yàn)榉謪^(qū)中的每條消息都保證按時(shí)間順序排列。因此,按順序消耗。

> Messages being consumed in order from partitions.
進(jìn)入該分區(qū)的每條消息都在該分區(qū)中排序。即使有多個(gè)用戶(或其他實(shí)體)映射到相同的分區(qū)(紅色/綠色)。您仍然可以為每個(gè)訂購(gòu)用戶消息。

> Regardless of why different message types are mApped into single partitions, they maintain order
將訂購(gòu)來(lái)自分區(qū)的消息。但分區(qū)可以隨時(shí)發(fā)出消息。因此,主題,不要保證訂單。這有點(diǎn)奇怪。我知道。下面,請(qǐng)注意兩個(gè)分區(qū)如何發(fā)送自己的消息。但是,無(wú)論其他分區(qū)如何,他們都這樣做。他們?nèi)匀槐3肿约旱男畔⒂唵巍?/p>
> Two perfectly valid scenarIOS. Each partition maintains order for its own messages.
如果您的消費(fèi)者依賴于消息訂單(跟蹤用戶點(diǎn)擊在您的站點(diǎn)中),則您將希望更多地查看這些主題分區(qū)策略(這是本文的范圍)。如果沒(méi)有,默認(rèn)策略將為您工作。
讓我們現(xiàn)在縮小一下并了解Kafka如何做到這一點(diǎn)。
基礎(chǔ)設(shè)施
如果我們退后一步,讓我們看看我們的第一個(gè)圖表。什么是kafka云?

> Two services communicating via Kafka
它實(shí)際上是一組服務(wù)器。我們將看到的第一個(gè)是Kafka群集的頭部,Zookeeper。

> Zookeeper routing traffic in and out of the Kafka cluster.
zookeeper管理您的所有主題和分區(qū)。它基本上維護(hù)了一組Kafka群集節(jié)點(diǎn),其中存儲(chǔ)主題和分區(qū)。這些節(jié)點(diǎn)是構(gòu)成Kafka集群的單獨(dú)機(jī)器(例如,EC2實(shí)例)。

> Zookeeper maintaining a set of nodes
如果我們有兩個(gè)主題,每個(gè)主題都有兩個(gè)分區(qū),這是我們之前可能以前可視化的。請(qǐng)注意,分區(qū)與現(xiàn)在的主題相同。

> Two topics with two partitions
我們將編號(hào)分區(qū)以幫助稍后識(shí)別它們。

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

> Topic A, Partition #1
您不必在每個(gè)節(jié)點(diǎn)上放置分區(qū)。你可能不想。它會(huì)變得昂貴。另一方面,您將擁有一個(gè)有彈性的系統(tǒng)。讓我們看看為什么。
如果消息進(jìn)入,則會(huì)將其路由到其中一個(gè)節(jié)點(diǎn)中的分區(qū),稱為領(lǐng)導(dǎo)者。zookeeper為領(lǐng)導(dǎo)者分配。

> A message sent to the leader.
Zookeeper將像以前一樣將消息發(fā)送給消費(fèi)者。它還將將消息復(fù)制到分區(qū)的其他副本。追隨者。

> Sending the message to the consumer and duplicating it on all of the followers
現(xiàn)在,分區(qū)的每個(gè)副本都包含我們的消息!如果一個(gè)節(jié)點(diǎn)拆卸或爆炸,Zookeeper將重新分配給不同的節(jié)點(diǎn)。

> Message in each partition copy
這是與我們添加的彼此分區(qū)相同的過(guò)程。我們現(xiàn)在將在我們的群集中保留兩個(gè)分區(qū)副本。

> Two partition copies
現(xiàn)在讓我們?cè)诹硪粋€(gè)分區(qū)#2中添加主題A.它也只是兩個(gè)副本。現(xiàn)在,主題A完全在我們的集群中!兩個(gè)分區(qū)都被復(fù)制和維護(hù)。

> Partition #1 and #2 in our cluster.
現(xiàn)在,讓我們?cè)谥黝}B的分區(qū)中添加分區(qū)。我們現(xiàn)在假設(shè)兩個(gè)副本。這是我們的Kafka集群與兩個(gè)主題!我們已經(jīng)完成了!

> Both clusters
它可能有助于比較我們以前擁有的東西。請(qǐng)注意,主題如何在群集中傳播。

> What we had before.

> What we have now!
結(jié)論
我希望你現(xiàn)在對(duì)Kafka更好地了解。我希望這些可視化能幫助您詢問(wèn)哪些問(wèn)題,以便詢問(wèn)。本文中的每個(gè)原則上都有令人難以置信的指南。
謝謝你的閱讀!并且非常感謝Kafka創(chuàng)作者制作一個(gè)令人難以置信的平臺(tái)。
(本文由聞數(shù)起舞翻譯自123 Followers的文章《Visualizing Kafka》,轉(zhuǎn)載請(qǐng)注明出處,原文鏈接:
https://timothystepro.medium.com/visualizing-kafka-20bc384803e7)