天天看點

kafka

1、kafka是什麼

apache kafka是一個開源消息系統,由scala寫成

kafka最初是由linkedin開發,并于2011年初開源

kafka是一個分布式消息隊列:生産者消費者的功能。它提供了類似于jms的特性,但是在設計實作上完全不同,此外它并不是jms規範的實作

kafka對消息儲存時根據topic進行分類,發送消息者稱為producer,消息接受者稱為consumer,此外kafka叢集有多個kafka執行個體組成,每個執行個體稱為broker

無論是kafka叢集還是producer和consumer都依賴于zookeeper叢集儲存一些meta資訊,來保證系統的可用性

jms:jms是java提供的一套技術規範。

    可以用來異構系統內建通信,緩解系統瓶頸,提高系統的伸縮性增強系統使用者體驗,使得系統子產品化群組件化變得可行并更加靈活。

類jms消息隊列,結合jms中的兩種模式,可以有多個消費者主動拉取資料,在jms中隻有點對點模式才有消費者主動拉取資料。

kafka

kafka是一個生産-消費模型。

    01.producer:生産者

        隻負責資料生産,生産者的代碼可以內建到任務系統中。 資料的分發政策由producer決定,預設是defaultpartition  utils.abs(key.hashcode) % numpartitions

    02.broker:

        目前伺服器上的kafka程序,俗稱拉皮條。隻管資料存儲,不管是誰生産,不管是誰消費。在叢集中每個broker都有一個唯一brokerid,不得重複。

    03.topic:

        目标發送的目的地,這是一個邏輯上的概念,落到磁盤上是一個partition的目錄。partition的目錄中有多個segment組合(index,log)

        一個topic對應多個partition[0,1,2,3],一個partition對應多個segment組合。一個segment有預設的大小是1g。

        每個partition可以設定多個副本(replication-factor 1),會從所有的副本中選取一個leader出來。所有讀寫操作都是通過leader來進行的。

        特别強調,和mysql中主從有差別,mysql做主從是為了讀寫分離,在kafka中讀寫操作都是leader。

    04.consumergroup:

        資料消費者組,consumergroup可以有多個,每個consumergroup消費的資料都是一樣的。

        可以把多個consumer線程劃分為一個組,組裡面所有成員共同消費一個topic的資料,組員之間不能重複消費。

        (在下面代碼配置檔案中,可以設定groupid和讀取的位置)

    05.zookeeper

        依賴叢集儲存meta資訊(每次讀取到哪的資訊)。

kafka

2、kafka生産資料時的分組政策

    預設是defaultpartition  utils.abs(key.hashcode) % numpartitions

    上文中的key是producer在發送資料時傳入的,produer.send(keyedmessage(topic,mypartitionkey,messagecontent))

3、kafka如何保證資料的完全生産

    ack機制:broker表示發來的資料已确認接收無誤,表示資料已經儲存到磁盤。

    0:不等待broker傳回确認消息

    1:等待topic中某個partition leader儲存成功的狀态回報

    -1:等待topic中某個partition 所有副本都儲存成功的狀态回報

4、broker如何儲存資料

    在理論環境下,broker按照順序讀寫的機制,可以每秒儲存600m的資料。主要通過pagecache機制,盡可能的利用目前實體機器上的空閑記憶體來做緩存。

    目前topic所屬的broker,必定有一個該topic的partition,partition是一個磁盤目錄。partition的目錄中有多個segment組合(index,log)

5、partition如何分布在不同的broker上

    int i = 0

    list{kafka01,kafka02,kafka03}

    for(int i=0;i<5;i++){

        brindex = i%broker;

        hostname = list.get(brindex)

    }

6、consumergroup的組員和partition之間如何做負載均衡

    最好是一一對應,一個partition對應一個consumer。

    如果consumer的數量過多,必然有空閑的consumer。

    算法:

        假如topic1,具有如下partitions: p0,p1,p2,p3

        加入group中,有如下consumer: c1,c2

        首先根據partition索引号對partitions排序: p0,p1,p2,p3

        根據consumer.id排序: c0,c1

        計算倍數: m = [p0,p1,p2,p3].size / [c0,c1].size,本例值m=2(向上取整)

        然後依次配置設定partitions: c0 = [p0,p1],c1=[p2,p3],即ci = [p(i * m),p((i + 1) * m -1)]

7、如何保證kafka消費者消費資料是全局有序的

    僞命題

    如果要全局有序的,必須保證生産有序,存儲有序,消費有序。

    由于生産可以做叢集,存儲可以分片,消費可以設定為一個consumergroup,要保證全局有序,就需要保證每個環節都有序。

    隻有一個可能,就是一個生産者,一個partition,一個消費者。這種場景和大資料應用場景相悖。

8.kafka生産資料

9.kafka消費資料(低階)

10.kafka和zookeeper使用javaapi能夠拉取到資料(高階消費)

properties配置檔案

kafka配置檔案(注意groupid)

然後在spring配置檔案中import kafka的配置檔案

java接收: