消息隊(duì)列Kafka的基本知識(shí)及.NETCore客戶端是怎樣的

今天就跟大家聊聊有關(guān)消息隊(duì)列 Kafka 的基本知識(shí)及 .NET Core 客戶端是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

盈江網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),盈江網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為盈江上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的盈江做網(wǎng)站的公司定做!

前言

最新項(xiàng)目中要用到消息隊(duì)列來(lái)做消息的傳輸,之所以選著 Kafka 是因?yàn)橐浜掀渌?java 項(xiàng)目中,所以就對(duì) Kafka 了解了一下,也算是做個(gè)筆記吧。

下面不談?wù)?Kafka 和其他的一些消息隊(duì)列的區(qū)別,包括性能及其使用方式。

簡(jiǎn)介

Kafka 是一個(gè)實(shí)現(xiàn)了分布式的、具有分區(qū)、以及復(fù)制的日志的一個(gè)服務(wù)。它通過(guò)一套獨(dú)特的設(shè)計(jì)提供了消息系統(tǒng)中間件的功能。它是一種發(fā)布訂閱功能的消息系統(tǒng)。

一些名詞

如果要使用 Kafka ,那么在 Kafka 中有一些名詞需要知道,文本不討論這些名詞是否在其他消息隊(duì)列中具有相同的含義。所有名詞均是針對(duì)于 Kafka。

Message

消息,就是要發(fā)送的內(nèi)容,一般包裝成一個(gè)消息對(duì)象。

Topic

通俗來(lái)講的話,就是放置“消息”的地方,也就是說(shuō)消息投遞的一個(gè)容器。假如把消息看作是信封的話,那么 Topic 就是一個(gè)郵筒。

Partition && Log

Partition 分區(qū),可以理解為一個(gè)邏輯上的分區(qū),像是我們電腦的磁盤 C:, D:, E: 盤一樣,
Kafka 為每個(gè)分區(qū)維護(hù)著一份日志Log文件。

每個(gè)分區(qū)是一個(gè)有序的,不可修改的,消息組成的隊(duì)列。 當(dāng)消息過(guò)來(lái)的時(shí)候,會(huì)被追加到日志文件中,這個(gè)追加是根據(jù) commit 命令來(lái)執(zhí)行的。

分區(qū)中的每一條消息都有一個(gè)編號(hào),叫做 offset id,這個(gè) id 在當(dāng)前分區(qū)中是唯一的,并且是遞增的。

日志,就是用來(lái)記錄分區(qū)中接收到的消息,因?yàn)槊恳粋€(gè) Topic 可以同時(shí)向一個(gè)或者多個(gè)分區(qū)投遞消息,所以實(shí)際在存儲(chǔ)日志的時(shí)候,每個(gè)分區(qū)會(huì)對(duì)應(yīng)一個(gè)日志目錄,其命名規(guī)則一般為 <topic_name>-<partition_id>, 目錄中就是一個(gè)分區(qū)的一份 commit log 日志文件。

消息隊(duì)列 Kafka 的基本知識(shí)及 .NET Core 客戶端是怎樣的

Kafka 集群會(huì)保存一個(gè)時(shí)間段內(nèi)所有被發(fā)布出來(lái)的信息,無(wú)論這個(gè)消息是否已經(jīng)被消費(fèi)過(guò),這個(gè)時(shí)間段是可以配置的。比如日志保存時(shí)間段被設(shè)置為2天,那么2天以內(nèi)發(fā)布的消息都是可以消費(fèi)的;而之前的消息為了釋放空間將會(huì)拋棄掉。Kafka的性能與數(shù)據(jù)量不相干,所以保存大量的消息數(shù)據(jù)不會(huì)造成性能問(wèn)題。

對(duì)日志進(jìn)行分區(qū)主要是為了以下幾個(gè)目的:第一、這可以讓log的伸縮能力超過(guò)單臺(tái)服務(wù)器上線,每個(gè)獨(dú)立的partition的大小受限于單臺(tái)服務(wù)器的容積,但是一個(gè)topic可以有很多partition從而使得它有能力處理任意大小的數(shù)據(jù)。第二、在并行處理方面這可以作為一個(gè)獨(dú)立的單元。

生產(chǎn)者 Producers

和其他消息隊(duì)列一樣,生產(chǎn)者通常都是消息的產(chǎn)生方。
在 Kafka 中它決定消息發(fā)送到指定Topic的哪個(gè)分區(qū)上。

消息隊(duì)列 Kafka 的基本知識(shí)及 .NET Core 客戶端是怎樣的

消費(fèi)者 Consumers

消費(fèi)者就是消息的使用者,在消費(fèi)者端也有幾個(gè)名詞需要區(qū)分一下。

一般消息隊(duì)列有兩種模式的消費(fèi)方式,分別是 隊(duì)列模式 和 訂閱模式

隊(duì)列模式:一對(duì)一,就是一個(gè)消息只能被一個(gè)消費(fèi)者消費(fèi),不能重復(fù)消費(fèi)。一般情況隊(duì)列支持存在多個(gè)消費(fèi)者,但是對(duì)于一個(gè)消息,只會(huì)有一個(gè)消費(fèi)者可以消費(fèi)它。

訂閱模式:一對(duì)多,一個(gè)消息可能被多次消費(fèi),消息生產(chǎn)者將消息發(fā)布到Topic中,只要是訂閱改Topic的消費(fèi)者都可以消費(fèi)。

Consumer && Subscriber

Group: 組,是一個(gè)消費(fèi)者的集合,每一組都有一個(gè)或者多個(gè)消費(fèi)者,Kafka 中在一個(gè)組內(nèi),消息只能被消費(fèi)一次。

在發(fā)布訂閱模式中,消費(fèi)者是以組的方式進(jìn)行訂閱的,就是Consumer Group,他們的關(guān)系如下圖:

消息隊(duì)列 Kafka 的基本知識(shí)及 .NET Core 客戶端是怎樣的

每個(gè)發(fā)布到Topic上的消息都會(huì)被投遞到每個(gè)訂閱了此Topic的消費(fèi)者組中的某一個(gè)消費(fèi)者,也就是每個(gè)組都會(huì)被投遞,但是每個(gè)組都只會(huì)有一個(gè)消費(fèi)者消費(fèi)這個(gè)消息。

開頭介紹了Kafka 是 發(fā)布-訂閱 功能的消息隊(duì)列,所以在Kafka中,隊(duì)列模式是通過(guò)單個(gè)消費(fèi)者組實(shí)現(xiàn)的,也就是整個(gè)結(jié)構(gòu)中只有一個(gè)消費(fèi)者組,消費(fèi)者之間負(fù)載均衡。

Kafka 集群

Borker: Kafka 集群有多個(gè)服務(wù)器組成,每個(gè)服務(wù)器稱做一個(gè) Broker。同一個(gè)Topic的消息按照一定的key和算法被分區(qū)存儲(chǔ)在不同的Broker上。

消息隊(duì)列 Kafka 的基本知識(shí)及 .NET Core 客戶端是怎樣的
上圖引用自:http://blog.csdn.net/lizhitao

因?yàn)?Kafka 的集群它是通過(guò)將分區(qū)散布到各個(gè)Server的實(shí)現(xiàn)的,也就是說(shuō)集群中每個(gè)服務(wù)器他們都是彼此共享分區(qū)的數(shù)據(jù)和請(qǐng)求,每個(gè)分區(qū)的日志文件被復(fù)制成指定分?jǐn)?shù),分散在各個(gè)集群機(jī)器,這樣來(lái)實(shí)現(xiàn)的故障轉(zhuǎn)移。

對(duì)于每一個(gè)分區(qū)都會(huì)有一個(gè)服務(wù)器作為它的 "leader" 并且有零個(gè)或者多個(gè)服務(wù)器作為"followers" 。leader 服務(wù)器負(fù)責(zé)處理關(guān)于這個(gè) partition 所有的讀寫請(qǐng)求, followers 服務(wù)器則被動(dòng)的復(fù)制 leader 服務(wù)器。如果有 leader 服務(wù)器失效,那么 followers 服務(wù)器將有一臺(tái)被自動(dòng)選舉成為新的 leader 。每個(gè)服務(wù)器作為某些 partition 的 leader 的同時(shí)也作為其它服務(wù)器的 follower ,從而實(shí)現(xiàn)了集群的負(fù)載均衡。

.NET Core Kafka 客戶端

在 .NET Core 中,有相對(duì)應(yīng)的開源 kafka sdk 項(xiàng)目,就是 Rdkafka。它同時(shí)支持 .NET 4.5,并且支持跨平臺(tái),可以運(yùn)行于Linux,macOS 和 Windows。

RdKafka Github :https://github.com/ah-/rdkafka-dotnet

RdKafka Nuget :Install-Package RdKafka

生產(chǎn)者 API
// Producer 接受一個(gè)或多個(gè) BrokerList
using (Producer producer = new Producer("127.0.0.1:9092"))//發(fā)送到一個(gè)名為 testtopic 的Topic,如果沒(méi)有就會(huì)創(chuàng)建一個(gè)u
sing (Topic topic = producer.Topic("testtopic")) {    
//將message轉(zhuǎn)為一個(gè) byte[]    byte[] data = Encoding.UTF8.GetBytes("Hello RdKafka");    DeliveryReport deliveryReport = await topic.Produce(data);        Console.WriteLine($"發(fā)送到分區(qū):{deliveryReport.Partition}, Offset 為: {deliveryReport.Offset}"); }
消費(fèi)者 API

由于 Kafka 是以消費(fèi)者組的形式進(jìn)行消費(fèi)的,所以需要指定一個(gè)GroupId。

在內(nèi)部實(shí)現(xiàn)上,消費(fèi)者是通過(guò)一個(gè)輪詢機(jī)制來(lái)實(shí)現(xiàn)的對(duì) Topic 消息的監(jiān)控,這也是Kafka推薦的方式,在 Rdkafka 中輪詢的間隔為 1 秒鐘。

//配置消費(fèi)者組
var config = new Config()
{
  GroupId = "example-csharp-consumer" };
  using (var consumer = new EventConsumer(config, "127.0.0.1:9092"))
 {    //注冊(cè)一個(gè)事件    consumer.OnMessage += (obj, msg) =>    {    
       string text = Encoding.UTF8.GetString(msg.Payload, 0, msg.Payload.Length);        Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {text}");    };    //訂閱一個(gè)或者多個(gè)Topic    consumer.Subscribe(new[] { "testtopic" });        //啟動(dòng)    consumer.Start();    Console.WriteLine("Started consumer, press enter to stop consuming");    Console.ReadLine(); }

看完上述內(nèi)容,你們對(duì)消息隊(duì)列 Kafka 的基本知識(shí)及 .NET Core 客戶端是怎樣的有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

分享題目:消息隊(duì)列Kafka的基本知識(shí)及.NETCore客戶端是怎樣的
網(wǎng)頁(yè)路徑:http://bm7419.com/article4/gejgoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、小程序開發(fā)、品牌網(wǎng)站制作、網(wǎng)站策劃、云服務(wù)器、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化