Kafka之第一課

一、入門

1、簡介

Kafka 是linkedin 公司用於日誌處理的分佈式消息隊列,同時支持離線和在線日誌處理。kafka 對消息保存時根據Topic進行歸類,發送消息者成爲Producer,消息接受者成爲Consumer,此外kafka 集羣有多個kafka 實例組成,每個實例(server)稱爲broker。無論是kafka集羣,還是producer和consumer 都依賴於zookeeper 來保證系統可用性,爲集羣保存一些meta 信息。
我們先來看下幾個消息傳遞系統的術語:

  • Kafka維護消息類別的東西是主題(topic).
  • 我們稱發佈消息到Kafka主題的進程叫生產者(producer).
  • 我們稱訂閱主題、獲取消息的進程叫消費者(consumer).
  • Kafka是由多個服務器組成的機器,每個服務器稱作代理(broker
    在較高的層次上看,生產者通過網絡發送消息到Kafka集羣,Kafka集羣將這些消息提供給消費者,如下圖:
    這裏寫圖片描述

客戶端與服務器之間的通信通過一個簡單的、高性能的、語言無關的TCP protocol. Kafka有Java客戶端,但這客戶端在很多語言many languages也是有效的。

Kafka的整體架構如圖所示。因爲Kafka內在就是分佈式的,一個Kafka集羣通常包括多個代理。爲了均衡負載,將話題分成多個分區,每個代理存儲一或多個分區。多個生產者和消費者能夠同時生產和獲取消息。

這裏寫圖片描述


2、主題(Topics)、日誌(Logs)

一個Topic 可以認爲是一類消息,每個topic 將被分成多個partition(區),每個partition 在存儲層面是append log 文件。任何發佈到此partition 的消息都會被直接追加到log 文件的尾部,每條消息在文件中的位置稱爲offset(偏移量),offset 爲一個long型數字,它是唯一標記一條消息。kafka 並沒有提供其他額外的索引機制來存儲offset,因爲在kafka 中幾乎不允許對消息進行“隨機讀寫”。
一個主題就是消息的類別或名稱。對每個主題,Kafka集羣都管理着一個被分區的日誌,如下:
每個分區就是一個提交日誌:每個分區上保存着不斷被追加的消息,這些消息是有序的且順序不可改變;分區上的每個消息都被分配了一個序列號offset,offset唯一標識了分區上的消息。
在kafka 中,即使消息被消費,消息仍然不會被立即刪除。日誌文件將會根據broker 中的配置要求,保留一定的時間之後刪除;比如log 文件保留2 天,那麼兩天後,文件會被清除,無論其中的消息是否被消費。kafka 通過這種簡單的手段,來釋放磁盤空間,以及減少消息消費之後對文件內容改動的磁盤IO 開支。
對於consumer 而言,它需要保存消費消息的offset,對於offset的保存和使用, 由consumer 來控制; 當consumer 正常消費消息時,offset 將會”線性”的向前驅動,即消息將依次順序被消費。事實上consumer 可以使用任意順序消費消息,它只需要將offset 重置爲任意值。(offset 將會保存在zookeeper 中,參見下文)
kafka集羣幾乎不需要維護任何consumer和producer 狀態信息,這些信息由zookeeper 保存;因此producer和consumer 的客戶端實現非常輕量級,它們可以隨意離開,而不會對集羣造成額外的影響。partitions的設計目的有多個。最根本原因是kafka基於文件存儲。通過分區,可以將日誌內容分散到多個server 上,來避免文件尺寸達到單機磁盤的上限,每個partiton都會被當前server(kafka實例)保存;可以將一個topic 切分多任意多個partitions來保存消息。此外越多的partitions 意味着可以容納更多的consumer,有效提升併發消費的能力。(具體原理參見下文)。這些特性表明,Kafka的消費者是非常廉價的,一個消費者的創建、銷燬不會對集羣或其他消費者產生多大的影響。


3、分佈式(Distribution)

一個Topic 的多個partitions,被分佈在kafka 集羣中的多個server 上;每個server(kafka 實例)負責partitions中消息的讀寫操作;此外kafka 還可以配置partitions 需要備份的個數(replicas),每個partition 將會被備份到多臺機器上,以提高可用性。
基於replicated(冗餘) 方案,那麼就意味着需要對多個備份進行調度;每個partition 都有一個機器爲”leader”;零個或多個機器作爲follower。leader 負責所有的讀寫操作,follower執行leader的指令。如果leader 失效,那麼將會有其他follower 來接管(成爲新的leader);follower只是單調的和leader 跟進,同步消息即可。由此可見作爲leader 的server 承載了全部的請求壓力,因此從集羣的整體考慮,有多少個partitions就意味着有多少個”leader”,kafka會將”leader”均衡的分散在每個實例上,來確保整體的性能穩定。

  1. 發送到partitions 中的消息將會按照它接收的順序追加到日誌中。
  2. 對於消費者而言,它們消費消息的順序和日誌中消息順序一致。
  3. 如果Topic 的”replicationfactor”(備份因子)爲N,那麼允許N-1 個kafka實例失效。

4、生產者(Producers)

Producer 將消息發佈到指定的Topic中,同時Producer 也能決定將此消息歸屬於哪個partition;這可以通過簡單的循環的方式來實現,或者使用一些分區方法(比如根據消息的key來分區)


5、消費者(Consumers)

傳統的消息傳遞有兩種方式: 隊列方式(queuing)、發佈-訂閱(publish-subscribe)方式.
隊列方式:一組消費者從機器上讀消息,每個消息只傳遞給這組消費者中的一個。
分佈-訂閱方式:消息被廣播到所有的消費者。Kafka提供了一個消費組(consumer group)的說法來概括這兩種方式。
消費者都屬於一個消費組;反過來說,每個消費組中可以有多個消費者。發送到Topic的消息,只會被訂閱此Topic的每個消費組中的一個消費組消費。如果所有的消費者都具有相同的消費組,這種情況和queue模式很像;消息將會在consumers之間負載均衡。如果所有的consumer 都具有不同的group,那這就是”發佈-訂閱”,消息將會廣播給所有的消費者。
在kafka 中,一個partition 中的消息只會被group 中的一個consumer 消費;每個group 中consumer 消息消費互相獨立;我們可以認爲一個group 是一個”訂閱”者,一個Topic 中的每個partions,只會被一個”訂閱者”中的一個consumer消費,不過一個consumer 可以消費多個partitions 中的消息。kafka只能保證一個partition中的消息被某個consumer 消費時,消息是順序的。事實上,從Topic 角度來說,消息仍不是有序的。kafka 的設計原理決定,對於一個topic,同一個group 中不能有多於partitions 個數的consumer 同時消費,否則將意味着某些consumer 將無法得到消息。

這裏寫圖片描述

  • 1.Kafka將主題下的分區分配給消費組裏的消費者,每個分區被一個消費者消費
  • 2.消費者的數量不能超過分區數
  • 3.Kafka只能保證分區內的消息是有序的
  • 4.如果你想要消息是全局有序的,你可以設置主題只有一個分區,同時這意味着只能有一個消費者

生產者發送的消息按照它們發送的順序追加到主題
消費者看到消息的順序就是消息在日誌中存儲的順序
由此可以得到 Kafka與傳統消息系統相比,有以下不同:

  • 它被設計爲一個分佈式系統,易於向外擴展;
  • 它同時爲發佈和訂閱提供高吞吐量;
  • 它支持多訂閱者,當失敗時能自動平衡消費者;
  • 它將消息持久化到磁盤,因此可用於批量消費,例如ETL,以及實時應用程序。

轉載出處http://write.blog.csdn.NET/postedit/51927081

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章