kafka入門介紹(轉載)

Kafka作為一個分布式的流平臺,這到底意味著什么?

我們認為,一個流處理平臺具有三個關鍵能力:

發布和訂閱消息(流),在這方面,它類似于一個消息隊列或企業消息系統。

以容錯的方式存儲消息(流)。

在消息流發生時處理它們。

什么是kakfa的優勢?

它應用于2大類應用:

構建實時的流數據管道,可靠地獲取系統和應用程序之間的數據。

構建實時流的應用程序,對數據流進行轉換或反應。

要了解kafka是如何做這些事情的,讓我們從下到上深入探討kafka的能力。

首先幾個概念:

kafka作為一個集群運行在一個或多個服務器上。

kafka集群存儲的消息是以topic為類別記錄的。

每個消息(也叫記錄record,我習慣叫消息)是由一個key,一個value和時間戳構成。

kafka有四個核心API:

應用程序使用Producer API發布消息到1個或多個topic(主題)。

應用程序使用Consumer API來訂閱一個或多個topic,并處理產生的消息。

應用程序使用Streams API充當一個流處理器,從1個或多個topic消費輸入流,并生產一個輸出流到1個或多個輸出topic,有效地將輸入流轉換到輸出流。

Connector API允許構建或運行可重復使用的生產者或消費者,將topic連接到現有的應用程序或數據系統。例如,一個關系數據庫的連接器可捕獲每一個變化。

img_9105e43104eb32b1b8549dca65e85aa8.png

Client和Server之間的通訊,是通過一條簡單、高性能并且和開發語言無關的TCP協議。除了Java Client外,還有非常多的其它編程語言的Client。

首先來了解一下Kafka所使用的基本術語:

Topic

Kafka將消息種子(Feed)分門別類,每一類的消息稱之為一個主題(Topic).

Producer

發布消息的對象稱之為主題生產者(Kafka topic producer)

Consumer

訂閱消息并處理發布的消息的種子的對象稱之為主題消費者(consumers)

Broker

已發布的消息保存在一組服務器中,稱之為Kafka集群。集群中的每一個服務器都是一個代理(Broker). 消費者可以訂閱一個或多個主題(topic),并從Broker拉數據,從而消費這些已發布的消息。

話題和日志? (Topic和Log)

讓我們更深入的了解Kafka中的Topic。

Topic是發布的消息的類別或者種子Feed名。對于每一個Topic,Kafka集群維護這一個分區的log,就像下圖中的示例:

img_1a8465abb3bca8c36e8bab6f9eadf472.png

每一個分區都是一個順序的、不可變的消息隊列, 并且可以持續的添加。分區中的消息都被分了一個序列號,稱之為偏移量(offset),在每個分區中此偏移量都是唯一的。

Kafka集群保持所有的消息,直到它們過期, 無論消息是否被消費了。 實際上消費者所持有的僅有的元數據就是這個偏移量,也就是消費者在這個log中的位置。 這個偏移量由消費者控制:正常情況當消費者消費消息的時候,偏移量也線性的的增加。但是實際偏移量由消費者控制,消費者可以將偏移量重置為更老的一個偏移量,重新讀取消息。 可以看到這種設計對消費者來說操作自如, 一個消費者的操作不會影響其它消費者對此log的處理。 再說說分區。Kafka中采用分區的設計有幾個目的。一是可以處理更多的消息,不受單臺服務器的限制。Topic擁有多個分區意味著它可以不受限的處理更多的數據。第二,分區可以作為并行處理的單元,稍后會談到這一點。

img_3e24ce76224d4707dfb9ce453a92671e.png

分布式(Distribution)

Log的分區被分布到集群中的多個服務器上。每個服務器處理它分到的分區。 根據配置每個分區還可以復制到其它服務器作為備份容錯。 每個分區有一個leader,零或多個follower。Leader處理此分區的所有的讀寫請求,而follower被動的復制數據。如果leader宕機,其它的一個follower會被推舉為新的leader。 一臺服務器可能同時是一個分區的leader,另一個分區的follower。 這樣可以平衡負載,避免所有的請求都只讓一臺或者某幾臺服務器處理。

生產者(Producers)

生產者往某個Topic上發布消息。生產者也負責選擇發布到Topic上的哪一個分區。最簡單的方式從分區列表中輪流選擇。也可以根據某種算法依照權重選擇分區。開發者負責如何選擇分區的算法。

消費者(Consumers)

通常來講,消息模型可以分為兩種, 隊列和發布-訂閱式。 隊列的處理方式是 一組消費者從服務器讀取消息,一條消息只有其中的一個消費者來處理。在發布-訂閱模型中,消息被廣播給所有的消費者,接收到消息的消費者都可以處理此消息。Kafka為這兩種模型提供了單一的消費者抽象模型: 消費者組 (consumer group)。 消費者用一個消費者組名標記自己。 一個發布在Topic上消息被分發給此消費者組中的一個消費者。 假如所有的消費者都在一個組中,那么這就變成了queue模型。 假如所有的消費者都在不同的組中,那么就完全變成了發布-訂閱模型。 更通用的, 我們可以創建一些消費者組作為邏輯上的訂閱者。每個組包含數目不等的消費者, 一個組內多個消費者可以用來擴展性能和容錯。正如下圖所示:

2個kafka集群托管4個分區(P0-P3),2個消費者組,消費組A有2個消費者實例,消費組B有4個。

img_27ed316eb692a347dbcabacf09779d96.png

正像傳統的消息系統一樣,Kafka保證消息的順序不變。 再詳細扯幾句。傳統的隊列模型保持消息,并且保證它們的先后順序不變。但是, 盡管服務器保證了消息的順序,消息還是異步的發送給各個消費者,消費者收到消息的先后順序不能保證了。這也意味著并行消費將不能保證消息的先后順序。用過傳統的消息系統的同學肯定清楚,消息的順序處理很讓人頭痛。如果只讓一個消費者處理消息,又違背了并行處理的初衷。 在這一點上Kafka做的更好,盡管并沒有完全解決上述問題。 Kafka采用了一種分而治之的策略:分區。 因為Topic分區中消息只能由消費者組中的唯一一個消費者處理,所以消息肯定是按照先后順序進行處理的。但是它也僅僅是保證Topic的一個分區順序處理,不能保證跨分區的消息先后處理順序。 所以,如果你想要順序的處理Topic的所有消息,那就只提供一個分區。

Kafka的保證(Guarantees)

生產者發送到一個特定的Topic的分區上,消息將會按照它們發送的順序依次加入,也就是說,如果一個消息M1和M2使用相同的producer發送,M1先發送,那么M1將比M2的offset低,并且優先的出現在日志中。

消費者收到的消息也是此順序。

如果一個Topic配置了復制因子(replication facto)為N, 那么可以允許N-1服務器宕機而不丟失任何已經提交(committed)的消息。

有關這些保證的更多詳細信息,請參見文檔的設計部分。

kafka作為一個消息系統

Kafka的流與傳統企業消息系統相比的概念如何?

傳統的消息有兩種模式:隊列和發布訂閱。 在隊列模式中,消費者池從服務器讀取消息(每個消息只被其中一個讀取); 發布訂閱模式:消息廣播給所有的消費者。這兩種模式都有優缺點,隊列的優點是允許多個消費者瓜分處理數據,這樣可以擴展處理。但是,隊列不像多個訂閱者,一旦消息者進程讀取后故障了,那么消息就丟了。而發布和訂閱允許你廣播數據到多個消費者,由于每個訂閱者都訂閱了消息,所以沒辦法縮放處理。

kafka中消費者組有兩個概念:隊列:消費者組(consumer group)允許同名的消費者組成員瓜分處理。發布訂閱:允許你廣播消息給多個消費者組(不同名)。

kafka的每個topic都具有這兩種模式。

kafka有比傳統的消息系統更強的順序保證。

傳統的消息系統按順序保存數據,如果多個消費者從隊列消費,則服務器按存儲的順序發送消息,但是,盡管服務器按順序發送,消息異步傳遞到消費者,因此消息可能亂序到達消費者。這意味著消息存在并行消費的情況,順序就無法保證。消息系統常常通過僅設1個消費者來解決這個問題,但是這意味著沒用到并行處理。

kafka做的更好。通過并行topic的parition —— kafka提供了順序保證和負載均衡。每個partition僅由同一個消費者組中的一個消費者消費到。并確保消費者是該partition的唯一消費者,并按順序消費數據。每個topic有多個分區,則需要對多個消費者做負載均衡,但請注意,相同的消費者組中不能有比分區更多的消費者,否則多出的消費者一直處于空等待,不會收到消息。

kafka作為一個存儲系統

所有發布消息到消息隊列和消費分離的系統,實際上都充當了一個存儲系統(發布的消息先存儲起來)。Kafka比別的系統的優勢是它是一個非常高性能的存儲系統。

寫入到kafka的數據將寫到磁盤并復制到集群中保證容錯性。并允許生產者等待消息應答,直到消息完全寫入。

kafka的磁盤結構 - 無論你服務器上有50KB或50TB,執行是相同的。

client來控制讀取數據的位置。你還可以認為kafka是一種專用于高性能,低延遲,提交日志存儲,復制,和傳播特殊用途的分布式文件系統。

kafka的流處理

僅僅讀,寫和存儲是不夠的,kafka的目標是實時的流處理。

在kafka中,流處理持續獲取輸入topic的數據,進行處理加工,然后寫入輸出topic。例如,一個零售APP,接收銷售和出貨的輸入流,統計數量或調整價格后輸出。

可以直接使用producer和consumer API進行簡單的處理。對于復雜的轉換,Kafka提供了更強大的Streams API。可構建聚合計算或連接流到一起的復雜應用程序。

助于解決此類應用面臨的硬性問題:處理無序的數據,代碼更改的再處理,執行狀態計算等。

Sterams API在Kafka中的核心:使用producer和consumer API作為輸入,利用Kafka做狀態存儲,使用相同的組機制在stream處理器實例之間進行容錯保障。

拼在一起

消息傳遞,存儲和流處理的組合看似反常,但對于Kafka作為流式處理平臺的作用至關重要。

像HDFS這樣的分布式文件系統允許存儲靜態文件來進行批處理。這樣系統可以有效地存儲和處理來自過去的歷史數據。

傳統企業的消息系統允許在你訂閱之后處理未來的消息:在未來數據到達時處理它。

Kafka結合了這兩種能力,這種組合對于kafka作為流處理應用和流數據管道平臺是至關重要的。

批處理以及消息驅動應用程序的流處理的概念:通過組合存儲和低延遲訂閱,流處理應用可以用相同的方式對待過去和未來的數據。它是一個單一的應用程序,它可以處理歷史的存儲數據,當它處理到最后一個消息時,它進入等待未來的數據到達,而不是結束。

同樣,對于流數據管道(pipeline),訂閱實時事件的組合使得可以將Kafka用于非常低延遲的管道;但是,可靠地存儲數據的能力使得它可以將其用于必須保證傳遞的關鍵數據,或與僅定期加載數據或長時間維護的離線系統集成在一起。流處理可以在數據到達時轉換它。

有關Kafka提供的保證,api和功能的更多信息,可繼續查閱本網

作者:半獸人

鏈接:http://orchome.com/5

來源:OrcHome

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455219.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cmd Markdown 編輯閱讀器

歡迎使用 Cmd Markdown 編輯閱讀器 我們理解您需要更便捷更高效的工具記錄思想,整理筆記、知識,并將其中承載的價值傳播給他人,Cmd Markdown 是我們給出的答案 —— 我們為記錄思想和分享知識提供更專業的工具。 您可以使用 Cmd Markdown&…

關于在smarty中實現省市區三級聯動

剛開始接觸php&#xff0c;&#xff0c;其實對于一些比較深入的東西還不是很了解&#xff0c;就像是這次的省市區聯動&#xff0c;都是用三張表為基礎編碼的&#xff0c;原諒我的無知&#xff0c;謝謝。 接下來就是編碼部分了&#xff1a; <?php require(./smarty/Smarty.c…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自動化發布和部署(1)

相關博文&#xff1a; Ubuntu 簡單安裝和配置 GitLabUbuntu 簡單安裝 DockerUbuntu Docker 簡單安裝 GitLabUbuntu Docker 安裝和配置 GitLab CI 持續集成服務器版本 Ubuntu 16.04 LTS。 經過上面四篇博文中的相關安裝和配置&#xff0c;我們主要完成了兩個容器的創建和運行&am…

X264學習筆記(1)

X264學習筆記&#xff08;1&#xff09; X264編碼流程 參數的初始化 1.opt&#xff0c;param根據輸入的參數和標準的規定&#xff0c;進行初始化設置。 Opt的說明如下&#xff1a; Opt->hin用于給出讀入的yuv文件的指針地址 Opt->hout給出了輸出的文件的指針地址 Opt->…

python 數字轉化excel行列_Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換...

Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母轉數字(python實現 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #實現從1對應Aif num > 25:while Tr…

錯誤提示:'……' is not assignable to Android.app.Activity Manifest XML

1 問題描述&#xff1a; 針對這段代碼&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

關于Lambda和匿名內部類

先上代碼&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…

H26L encoder.cfg參數分析

H264 encoder.cfg參數分析 收藏 (1) 文件操作參數:#Files InputFile "silent.yuv" #輸入序列,YUV 4:2:0 StartFrame 0 # 從視頻流的第幾幀開始編碼 FramesToBeEncoded 30 #編碼圖象幀數,指明了除去 B幀后將要被編碼的幀數(應該再實驗一下&#x…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、關鍵步驟 1.刪除舊的ckeditor靜態文件 所在目錄&#xff1a;項目目錄下的static文件夾下的ckditor文件夾 rm ckeditor -rf 原因&#xff1a;在安裝ckeditor后需要執行collectstatic命令&#xff0c;這個過程中的查找靜態文件會去…

python中最難的是什么_python什么的最難了

學的人很少的,如果你沒有學過編程,建議學c語言.因為python中文資料很少的.你可以先了解一下phthonpython的歷史python的創始人為guido van rossum。1989年圣誕節期間&#xff0c;在阿姆斯特丹&#xff0c;guido為了打發圣誕節的無趣&#xff0c;決心開發一個新的腳本解釋程序&a…

Python3生成腳本實現重置鍵盤鍵位

個人博客點這里 #!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋葉夏風# 本模塊的功能:<重置鍵盤鍵位>import sys import ossave_format "bat" # 這個值可以修改&#xff0c;有兩個選項(bat和reg)&#xff0c;可選擇生成bat批處理文件或者re…

《Java核心技術 卷Ⅱ 高級特性(原書第10版)》一2.2.2 如何讀入文本輸入

2.2.2 如何讀入文本輸入 最簡單的處理任意文本的方式就是使用在卷Ⅰ中我們廣泛使用的Scanner類。我們可以從任何輸入流中構建Scanner對象。或者&#xff0c;我們也可以將短小的文本文件像下面這樣讀入到一個字符串中&#xff1a; 在早期的Java版本中&#xff0c;處理文本輸入的…

leetcode add Two Numbers

部分 conditional operators ?:寫的statements 在有的編譯器下能通過&#xff0c;有的可能通不過 base operand of -> has non-pointer type ListNode轉載于:https://www.cnblogs.com/liyongguo/p/7152365.html

amap不同樣式marker點_想出一手漂亮的圖,CAD打印樣式表你必須會!

好課推薦&#xff1a;1.CAD2014&#xff1a;點擊查看2.室內CAD&#xff1a;點擊查看3.CAD2019&#xff1a;點擊查看4.CAD2018&#xff1a;點擊查看5.【bim】revit&#xff1a;點擊查看6.室內手繪&#xff1a;點擊查看7.CAD三維&#xff1a;點擊查看8.全屋定制&#xff1a;點擊查…

JM8.5中的7種宏塊模式問題

JM8.5中的7種宏塊模式問題 收藏 Outline: 1、 CFG文件中有關可變尺寸宏塊模式的相關選項2、 7種宏塊模式對應的數值常量3、 7種宏塊模式被分成宏塊和亞宏塊4、 如何對宏塊和亞宏塊的運動估計&#xff0c;采用一個共同的函數來處理5、 遺留問題1、CFG文件中有關可變尺寸宏塊…

python高級編程技巧

個人博客點這里 如何在列表,字典,集合中根據條件篩選數據 方法1:通過迭代來進行判斷篩選 解決方案 函數式編程: 如何統計序列中元素的出現頻度 解決方案:使用collections.Counter對象 將序列傳入Counter的構造器,得到Counter對象是元素頻度的字典 Counter.most_common(n)…

2016年安全身份識別主流趨勢

安全身份識別解決方案商HID Global通過從不同行業市場的重要客戶那里所獲得的深刻洞察&#xff0c;以及公司最新解決方案在前瞻性合作伙伴和全球各地的終端用戶中進行的試點項目與正式部署情況&#xff0c;確定了2016年最值得業界關注的安全趨勢。HID Global 廣闊的行業視角&am…

列出一個目錄中所有文件及大小

package com.test.tree;import java.io.File;/*** 列出一個目錄中所有的文件和他們的大小* author wyl**/ public class FileList {public void list(File f){ //文件根目錄&#xff0c;深度為0list(f,0);}/*** * param f* param depth 為了顯示文件的層級形式*/public void li…

多媒體音頻格式解析WMA WAV OGG AAC APE FLAC

無論是MP3還是MP4&#xff0c;甚至手機和多媒體DC&#xff0c;產品所支持的各種格式往往讓人眼花繚亂。特別是對于剛上手的新手玩家來說&#xff0c;各種格式都有哪些特性&#xff0c;在實際 使用當中有多少格式實用或者必須&#xff0c;其實有很多方面需要我們來系統的了解。這…

數據分析之pandas筆記

Pandas 一個用于表示表格類型的內容 課時4&#xff1a;jupyter21 分22 秒課時5&#xff1a;pandas的內容24 分31 秒課時6&#xff1a;series內容38 分19 秒課時7&#xff1a;dataframe25 分50 秒 # 載入pandas庫 import pandas as pd import numpy as nps pd.Series([2,4,6…