# Kafka基礎概念
### 前言
最近項目中要使用到流式數據處理,借此機會學習一下Kafka的相關知識。
### 簡介
Apache Kafka是一個分布式的、分區的、可重復提交的日志系統。它以獨特的設計提供了消息系統的功能。作為一個Apache開源項目,Kafka已經得到很多業內人士的關注,并且已經在很多公司內部進行使用,如Linkin、eBay等。
Kafka作為一個分布式發布-訂閱系統,也遵循著一般的發布-訂閱系統的基礎架構。

Kafka中將不同的消息通過不同的主題(topic)來區分,在圖中,生產者向Kafka集群發布消息,消費者通過向某一個主題注冊,進而接收相關主題的消息。Kafka可以運行在一臺或多臺的服務器上,每臺服務器成為一個經紀人(broker)。
### 主要概念
### 分區(Partition)
Kafka會為每個主題分一個區,發布的消息都會存到相應的分區中。每個分區是一個有序的、不可變的序列,每條消息通過偏移量來定位。具體情形如下:

這樣做的好處是,因為一個主題可以有多個分區,所以可以容易地拓展主題的容量到多臺機器。同時分區也為高并發、高容錯性提供了可能性。
### 主題(Topics)和日志(Logs)
需要注意的是,Kafka保存數據是根據時間來決定的,而不是它是否被消費者消費。如果在數據的生命周期內,它被消費后仍然會存儲在Kafka中。但如果它在生命周期內沒有被消費,同樣它也會在生命周期結束時被丟棄。而消費者是通過分區中的偏移量來定位消費的數據的,通常是順序讀下去,但也可以通過改變偏移量的值來隨意讀取信息。
### 分布式(Distribution)
分布式跟分區是緊密相連的,正是數據是以分區的形式存儲的,才給分布式提供了可能。分區的數據會在多個服務器上進行備份以便容錯。每份數據都會以主分區的形式存儲在某一臺服務器上,它的副本稱為從分區,存儲在其他服務器上。主分區處理來自外界的讀寫請求,從分區會被動的復制數據的變化。如果主分區出現了故障,某一個從分區會變為主分區。此外一臺服務器可以擁有一個主分區和多個其他分區的從分區,這樣能充分利用資源,又保證了容錯性。
### 生產者(Producers)
生產者決定發布什么消息、消息屬于哪個主題及在該主題的哪個分區下,關于分區的選擇可以通過自己設定的方法來實現不同的方案。
### 消費者(Consumers)
消費者會被被劃分成一個個消費者組,屬于某一個主題的消息會被分派到它的一個分區下,而該分區與訂閱了該主題的消費組中的某一個消費者相對應,也就是說消息只會發送給訂閱的消費者組中的一個消費者。可以把消費者組理解成消息的真正的訂閱者,而它下面的消費者只是處理消息的線程池,這樣做可以保證系統的擴展性和容錯性。而消費者與分區的關系是,每個分區只能有一個消費者,這樣保證了在這一分區中的所有消息都能按序處理。但不同分區中的消息處理順序不能保證,如果要保證所有的數據都按序處理,可以使每個話題只有一個分區,每個消費者組只有一個消費者。
### 保證(Guarantees)
Kafka可以保證:
- 由生產者發送給特定主題分區的消息會以發送的順序添加。也就是說,后發送的消息一定在先發送的消息之后。
- 消費者會按消息在日志中的存儲順序看到它們。
- 對于副本因子為N的主題,我們可以承受N-1個服務器發生故障而保證提交到日志的消息不會丟失。
### 應用場景
### 消息隊列
跟大多數的消息系統相比,Kafka有更好的吞吐量和容錯性,這讓Kafka成為了一個很好的大規模消息處理應用的解決方案。消息系統一般吞吐量相對較低,但是需要更小的端到端延時,而Kafka能提供這些保障。
### 網頁行為跟蹤
Kafka的另一個應用場景是跟蹤用戶瀏覽頁面、搜索操作及其他用戶行為,以發布-訂閱的模式實時記錄到對應的話題中。這些結果被訂閱者拿到后就可以做進一步的處理。
### 數據監控
Kafka也可以作為操作記錄的監控模塊來使用,即匯集記錄一些操作信息,對系統進行監控。
### 日志聚合
日志聚合一般來說是從服務器上收集日志文件,然后放到一個集中的位置進行處理。然而Kafka忽略掉文件的細節,將其更清晰地抽象成一個個日志或事件的消息流。這就讓Kafka處理過程延遲更低,更容易支持多數據源和分布式數據處理。比起以日志為中心的系統比如Scribe或者Flume來說,Kafka提供同樣高效的性能和因為冗余達到的更高的可用性保證,以及更低的端到端延遲。
### 流式處理
這是Kafka的一個重要應用場景。保存收集流數據,以提供給之后對接的Storm或其他流式計算框架進行處理。很多用戶會對那些從原始話題來的數據進行階段性處理、匯總、擴充或者以其他的方式轉換到新的話題下再繼續后面的處理。
### 事件源
事件源是一種應用程序設計的方式,該方式的狀態轉移被記錄為按時間順序排序的記錄序列。Kafka可以存儲大量的日志數據,這使得它成為一個對這種方式的應用來說絕佳的后臺。
### 持久性日志
Kafka可以為一種外部的持久性日志的分布式系統提供服務。這種日志可以在節點間備份數據,并為故障節點數據回復提供一種重新同步的機制。Kafka中日志壓縮功能為這種用法提供了條件。在這種用法中,Kafka類似于Apache BookKeeper項目。
### 總結
這篇文章主要介紹了Apache Kafka中的幾個基本概念,及其應用場景。