KAFKA介紹(分布式架構)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

介紹

Kafka是一個分布式的、可分區的、可復制的消息系統。它提供了普通消息系統的功能,但具有自己獨特的設計。這個獨特的設計是什么樣的呢?

首先讓我們看幾個基本的消息系統術語:

Kafka將消息以topic為單位進行歸納。

將向Kafka topic發布消息的程序成為producers.

將預訂topics并消費消息的程序成為consumer.

Kafka以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個broker.

producers通過網絡將消息發送到Kafka集群,集群向消費者提供消息,如下圖所示:

客戶端和服務端通過TCP協議通信。Kafka提供了Java客戶端,并且對多種語言都提供了支持。

Topics 和Logs

先來看一下Kafka提供的一個抽象概念:topic.

一個topic是對一組消息的歸納。對每個topic,Kafka 對它的日志進行了分區,如下圖所示:

每個分區都由一系列有序的、不變的消息組成,這些消息被連續的追加到分區中。分區中的每個消息都有一個連續的序列號叫做offset,用來在分區中唯一的標識這個消息。

在一個可配置的時間段內,Kafka集群保留所有發布的消息,不管這些消息有沒有被消費。比如,如果消息的保存策略被設置為2天,那么在一個消 息被發布的兩天時間內,它都是可以被消費的。之后它將被丟棄以釋放空間。Kafka的性能是和數據量無關的常量級的,所以保留太多的數據并不是問題。

實際上每個consumer唯一需要維護的數據是消息在日志中的位置,也就是offset.這個offset有consumer來維護:一般情 況下隨著consumer不斷的讀取消息,這offset的值不斷增加,但其實consumer可以以任意的順序讀取消息,比如它可以將offset設置 成為一個舊的值來重讀之前的消息。

以上特點的結合,使Kafka consumers非常的輕量級:它們可以在不對集群和其他consumer造成影響的情況下讀取消息。你可以使用命令行來"tail"消息而不會對其他正在消費消息的consumer造成影響。

將日志分區可以達到以下目的:首先這使得每個日志的數量不會太大,可以在單個服務上保存。另外每個分區可以單獨發布和消費,為并發操作topic提供了一種可能。

分布式

每個分區在Kafka集群的若干服務中都有副本,這樣這些持有副本的服務可以共同處理數據和請求,副本數量是可以配置的。副本使Kafka具備了容錯能力。

每個分區都由一個服務器作為“leader”,零或若干服務器作為“followers”,leader負責處理消息的讀和 寫,followers則去復制leader.如果leader down了,followers中的一臺則會自動成為leader。集群中的每個服務都會同時扮演兩個角色:作為它所持有的一部分分區的leader,同 時作為其他分區的followers,這樣集群就會據有較好的負載均衡。

Producers

Producer將消息發布到它指定的topic中,并負責決定發布到哪個分區。通常簡單的由負載均衡機制隨機選擇分區,但也可以通過特定的分區函數選擇分區。使用的更多的是第二種。

Consumers

發布消息通常有兩種模式:隊列模式和發布-訂閱模式。隊列模式中,consumers可以同時從服務端讀取消息,每個消息只被其中一個consumer讀到;發布-訂閱模式中消息被廣播到所有的consumer中。

Consumers可以加入一個consumer 組,共同競爭一個topic,topic中的消息將被分發到組中的一個成員中。同一組中的consumer可以在不同的程序中,也可以在不同的機器上。如果所有的consumer都在一個組中,這就成為了傳統的隊列模式,在各consumer中實現負載均衡。

如果所有的consumer都不在不同的組中,這就成為了發布-訂閱模式,所有的消息都被分發到所有的consumer中。

更常見的是,每個topic都有若干數量的consumer組,每個組都是一個邏輯上的“訂閱者”,為了容錯和更好的穩定性,每個組由若干consumer組成。這其實就是一個發布-訂閱模式,只不過訂閱者是個組而不是單個consumer。

由兩個機器組成的集群擁有4個分區 (P0-P3) 2個consumer組. A組有兩個consumerB組有4個

相比傳統的消息系統,Kafka可以很好的保證有序性。

傳統的隊列在服務器上保存有序的消息,如果多個consumers同時從這個服務器消費消息,服務器就會以消息存儲的順序向consumer分 發消息。雖然服務器按順序發布消息,但是消息是被異步的分發到各consumer上,所以當消息到達時可能已經失去了原來的順序,這意味著并發消費將導致 順序錯亂。為了避免故障,這樣的消息系統通常使用“專用consumer”的概念,其實就是只允許一個消費者消費消息,當然這就意味著失去了并發性。

在這方面Kafka做的更好,通過分區的概念,Kafka可以在多個consumer組并發的情況下提供較好的有序性和負載均衡。將每個分區分 只分發給一個consumer組,這樣一個分區就只被這個組的一個consumer消費,就可以順序的消費這個分區的消息。因為有多個分區,依然可以在多 個consumer組之間進行負載均衡。注意consumer組的數量不能多于分區的數量,也就是有多少分區就允許多少并發消費。

Kafka只能保證一個分區之內消息的有序性,在不同的分區之間是不可以的,這已經可以滿足大部分應用的需求。如果需要topic中所有消息的有序性,那就只能讓這個topic只有一個分區,當然也就只有一個consumer組消費它。

歡迎大家一起學習研究相關技術愿意了解框架技術或者源碼的朋友直接求求交流分享技術:2042849237

轉載于:https://my.oschina.net/u/3873725/blog/1935676

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

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

相關文章

jquery 回車事件

簡單地記下jquery實現回車事件,代碼如下:全局: $(document).keydown(function(e){if(e.keyCode13){$(".login-li input[typebutton]").trigger("click");} });某個控件: $("body").keydown(functio…

Three.js 詳細解析(持續更新)

1、簡介; Three.js依賴一些要素,第一是scene,第二是render,第三是carmea npm install --save three import * as THREE from "three"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js&quo…

[js高手之路]構造函數的基本特性與優缺點

上文,通過基本的對象創建問題了解了構造函數,本文,我們接著上文繼續了解構造函數的基本特性,以及優缺點. 每個對象上面都有一個constructor屬性( 嚴格意義上來說,是原型上的,對象是通過查找到原型找到 constructor屬性…

Design Compiler指南——施加設計約束

Design Compiler是一個約束驅動(constrain-driven)的綜合工具,它的結果是與設計者施加的約束條件密切相關的。在本文里,我們主要討論怎樣給電路施加約束條件,這些約束主要包括——時序和面積約束、電路的環境屬性、時序和負載在不同模塊之間的…

Python:eval的妙用和濫用

時間 2014-07-08 13:05:24 CSDN博客 原文 http://blog.csdn.net/zhanh1218/article/details/37562167主題 Python eval()函數十分強大,官方demo解釋為:將字符串str當成有效的表達式來求值并返回計算結果。 so,結合math當成一個計算器很好用…

程維柳青發布道歉聲明:滴滴順風車業務將無限期下線

雷鋒網(公眾號:雷鋒網)消息,8 月 28 日晚間,滴滴創始人兼 CEO 程維和滴滴總裁柳青正式發出道歉聲明,向受害者和受害者家屬道歉——這已經離本次滴滴順風車悲劇的發生整整四天的時間。 聲明表示,滴滴不再以規模和增長作…

MATLAB圖像增強程序舉例

1.灰度變換增強程序: % GRAY TRANSFORM clc; Iimread(pout.tif); imshow(I); Jimadjust(I,[0.3 0.7],[0 1],1); %transforms the walues in the %intensity image I to values in J by linealy mapping %values between 0.3 and 0.7 to values between 0 and 1. fi…

Design Compiler指南——設計綜合過程

在前面一章介紹完施加約束之后,接下來要做的工作就是將設計進行綜合編譯(compile),本文我們將主要討論綜合編譯的過程。主要分為這樣幾個部分: 優化的三個階段及其特點編譯的策略編譯層次化的設計 一、優化的三個階段 這一節我們介紹Design …

How to find Material based on Sales Organization and Distribution Channel

Fetch data from Database View /BEV1/RBEA_V Fields: VKORG - Sales Organization VTWEG - Distribution Channel MATNR - Material Number 轉載于:https://www.cnblogs.com/JulietLV/p/7436028.html

iOS開發 iOS10兼容訪問http

添加NSAppTransportSecurity的字典會自動變成 AppTransportSecurity再添加 allow Arbitary Loads Boolean YES轉載于:https://www.cnblogs.com/diweinan/p/6233052.html

django 利用PIL 保存圖片

在使用django時不知道怎么保存圖片,又不想用它的form ,在網上找了許久,終于找到個解決方案,利用PIL.image 將POST上來的圖片保存到media目錄下,然后再修改models from PIL import Imagescreen_name request.POST.get(…

圖像轉灰度圖

MyYuanLaiPic imread(e:/image/matlab/darkMouse.jpg);%讀取RGB格式的圖像 MyFirstGrayPic rgb2gray(MyYuanLaiPic);%用已有的函數進行RGB到灰度圖像的轉換 [rows , cols , colors] size(MyYuanLaiPic);%得到原來圖像的矩陣的參數 MidGrayPic zeros(rows , cols);…

Design Compiler指南——后綜合過程

本文我們著重討論使用Design Compiler綜合大型設計時要注意的一些問題,比如怎樣調整綜合方法,出現約束違反后怎樣修正,怎樣給不同的子模塊作時序和負載預算,以及給整個設計在具體綜合之前先作一個預估(Design Exploration)等等。 …

web worker原理 SSE原理

第一部分 什么是 web worker? 我們一直強調JavaScript是單線程的,但是web worker的出現使得JavaScript可以在多線程上跑,只是web worker本身適合用于一些復雜的、耗費cpu的運算,不能操作window、document、parent對象&#xff0c…

如何尋回xp盤符丟失的數據

分區丟失是比較常見的數據恢復案例,需要注意,分區丟失后不要再重建新的分區。保護好資料丟失現場,可以最大程度的恢復出資料。具體的恢復方法看正文了解。 工具/軟件:星空數據恢復軟件 步驟1:先百度搜索并下載程序打開…

afx_msg函數意思

應用程序框架產生的消息映射函數 例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg為消息標志,它向系統聲明:有消息映射到函數實現體; 而在map宏定義中,就有具體消息和此函數的映射定義(可以是自定義…

文件得編碼和文件名的編碼是不一樣的

1.新知識,通過文件后墜名的編碼判斷文件類型,可以有效的防止腳本文件偽裝為正常得文件。 2.攔截器和過濾器。 過濾器只能夠在http請求和回復的時候進行處理。 但是攔截器可以在很多地方攔截,例如程序拋異常等都可以捕獲的到。還可以進行權限得…

Visual computing——概述

Visual Computing(視覺計算)是所有處理二維圖像和三維模型的計算機科學學科的總稱,即計算機圖形學、圖像處理、可視化、計算機視覺、虛擬和增強現實、視頻處理,但也包括模式識別、人機交互、機器學習等方面。核心挑戰是視覺信息&a…

推薦!手把手教你使用Git

一:Git是什么? Git是目前世界上最先進的分布式版本控制系統。 二:SVN與Git的最主要的區別? SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而干活的時候,用的都是自己的電腦&#xff0…

I2C協議學習

I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半導體(現被NXP收購)開發的兩線式串行總線,常用于微控制器與外設之間的連接。 一、概述 以下是 I2C 總線的一些特性: 只需要兩條總線;一條串行數據線 (SDA) 和…