通過Kafka的快速入門 https://www.cnblogs.com/tree1123/p/11150927.html
能了解到Kafka的基本部署,使用,但他和其他的消息中間件有什么不同呢?
Kafka的基本原理,術(shù)語,版本等等都是怎么樣的?到底什么是Kafka呢?
一、Kafka簡介
2011年,LinkIn開源, November 1, 2017 1.0版本發(fā)布 July 30, 2018 2.0版本發(fā)布
參考官網(wǎng)的圖:

Kafka?用于構(gòu)建實(shí)時(shí)數(shù)據(jù)管道和流式應(yīng)用程序。它具有水平可擴(kuò)展性、容錯性、速度極快,并在數(shù)千家公司投入生產(chǎn)。
kafka官網(wǎng)最新的定義:Apache Kafka? is a distributed streaming platform
也就是分布式流式平臺。
介紹:
三個(gè)特點(diǎn):
Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.
Store streams of records in a fault-tolerant durable way.
Process streams of records as they occur.
消息 持久化 流處理
兩類應(yīng)用:
Building real-time streaming data pipelines that reliably get data between systems or applications
-
Building real-time streaming applications that transform or react to the streams of data
實(shí)時(shí)流數(shù)據(jù)管道 實(shí)時(shí)流應(yīng)用程序
?
幾個(gè)概念
Kafka is run as a cluster on one or more servers that can span multiple datacenters.
The Kafka cluster stores streams of records in categories called topics.
-
Each record consists of a key, a value, and a timestamp
集群 topic record
?
四個(gè)核心api
The Producer API allows an application to publish a stream of records to one or more Kafka topics.
The Consumer API allows an application to subscribe to one or more topics and process the stream of records produced to them.
The Streams API allows an application to act as a stream processor, consuming an input stream from one or more topics and producing an output stream to one or more output topics, effectively transforming the input streams to output streams.
The Connector API allows building and running reusable producers or consumers that connect Kafka topics to existing applications or data systems. For example, a connector to a relational database might capture every change to a table.
Producer API Consumer API Streams API Connector API
?

客戶端服務(wù)器通過tcp協(xié)議 支持多種語言
主題和日志
一個(gè)主題可以有零個(gè),一個(gè)或多個(gè)消費(fèi)者訂閱寫入它的數(shù)據(jù)
對于每個(gè)主題,Kafka群集都維護(hù)一個(gè)分區(qū)日志
每個(gè)分區(qū)都是一個(gè)有序的,不可變的記錄序列,不斷附加到結(jié)構(gòu)化的提交日志中。
分區(qū)中的記錄每個(gè)都被分配一個(gè)稱為偏移的順序ID號,它唯一地標(biāo)識分區(qū)中的每個(gè)記錄。

Kafka集群持久地保留所有已發(fā)布的記錄 - 無論它們是否已被消耗 - 使用可配置的保留期??梢耘渲眠@個(gè)時(shí)間。
Kafka的性能在數(shù)據(jù)大小方面實(shí)際上是恒定的,因此長時(shí)間存儲數(shù)據(jù)不是問題。

每個(gè)消費(fèi)者保留的唯一元數(shù)據(jù)是該消費(fèi)者在日志中的偏移或位置。
這種偏移由消費(fèi)者控制:通常消費(fèi)者在讀取記錄時(shí)會線性地提高其偏移量,但事實(shí)上,由于消費(fèi)者控制位置,它可以按照自己喜歡的任何順序消費(fèi)記錄。例如,消費(fèi)者可以重置為較舊的偏移量以重新處理過去的數(shù)據(jù),或者跳到最近的記錄并從“現(xiàn)在”開始消費(fèi)。
這使得消費(fèi)者特別容易使用。
生產(chǎn)者:
生產(chǎn)者將數(shù)據(jù)發(fā)布到他們選擇的主題。
為了負(fù)載均衡,可以選擇多個(gè)分區(qū)。
消費(fèi)者:
消費(fèi)者組

傳統(tǒng)的消息隊(duì)列 發(fā)布訂閱 都有弊端
隊(duì)列可以擴(kuò)展但不是多用戶,發(fā)布訂閱每條消費(fèi)發(fā)給每個(gè)消費(fèi)者,無法擴(kuò)展。
但是kafka這個(gè)模式 解決了這些問題
kafka確保使用者是該分區(qū)的唯一讀者并按順序使用數(shù)據(jù),由于有許多分區(qū),這仍然可以
平衡許多消費(fèi)者實(shí)例的負(fù)載。
作為存儲系統(tǒng)
作為流處理系統(tǒng)
二、常見使用
消息
Kafka可以替代更傳統(tǒng)的消息代理。消息代理的使用有多種原因(將處理與數(shù)據(jù)生成器分離,緩沖未處理的消息等)。與大多數(shù)消息傳遞系統(tǒng)相比,Kafka具有更好的吞吐量,內(nèi)置分區(qū),復(fù)制和容錯功能,這使其成為大規(guī)模消息處理應(yīng)用程序的理想解決方案。
根據(jù)我們的經(jīng)驗(yàn),消息傳遞的使用通常相對較低,但可能需要較低的端到端延遲,并且通常取決于Kafka提供的強(qiáng)大的耐用性保證。
在這個(gè)領(lǐng)域,Kafka可與傳統(tǒng)的消息傳遞系統(tǒng)(如ActiveMQ或 RabbitMQ)相媲美。
網(wǎng)站活動跟蹤
站點(diǎn)活動(頁面查看,搜索或用戶可能采取的其他操作)發(fā)布到中心主題,每個(gè)活動類型包含一個(gè)主題。實(shí)時(shí)處理,實(shí)時(shí)監(jiān)控以及加載到Hadoop或離線數(shù)據(jù)倉庫系統(tǒng)以進(jìn)行離線處理和報(bào)告。
度量
Kafka通常用于運(yùn)營監(jiān)控?cái)?shù)據(jù)。
日志聚合
許多人使用Kafka作為日志聚合解決方案的替代品。日志聚合通常從服務(wù)器收集物理日志文件,并將它們放在中央位置(可能是文件服務(wù)器或HDFS)進(jìn)行處理。Kafka抽象出文件的細(xì)節(jié),并將日志或事件數(shù)據(jù)更清晰地抽象為消息流。
流處理
從0.10.0.0開始,這是一個(gè)輕量級但功能強(qiáng)大的流處理庫,名為Kafka Streams
三、官方文檔-核心機(jī)制
http://kafka.apache.org/documentation/
簡介 使用 快速入門 都已經(jīng)學(xué)習(xí)過了
生態(tài):這里有一些kafka的生態(tài),各種Connector 可以直接連接數(shù)據(jù)庫 es等等 還可以連接其他的流處理 還有各種管理工具
confluent公司 專門做kafka的生態(tài)
https://cwiki.apache.org/confluence/display/KAFKA/Ecosystem
kafka connect stream management
kafka考慮的幾個(gè)問題:
吞吐量: 用到了page cache 并不是硬盤讀寫
消息持久化: 這個(gè)還是靠他獨(dú)特的offset設(shè)計(jì)
負(fù)載均衡:分區(qū)副本機(jī)制
由于應(yīng)用 零拷貝技術(shù) 客戶端應(yīng)用epoll 所以kafka部署在linux上性能更高。
消息:kafka的消息由 key value timestamp組成 消息頭里定義了一些壓縮 版本號的信息
crc 版本號 屬性 時(shí)間戳 長度 key長度 key value長度 value
用的是二進(jìn)制 不用java類
topic和partition:
這是kafka最核心,也是最重要的機(jī)制,這個(gè)機(jī)制讓他區(qū)別于其他。
offset是指某一個(gè)分區(qū)的偏移量。
topic partition offset 這三個(gè)唯一確定一條消息。
生產(chǎn)者的offset其實(shí)就是最新的offset。
消費(fèi)者的offset是他自己維護(hù)的,他可以選擇分區(qū)最開始,最新,也可以記住他消費(fèi)到哪了。
消費(fèi)者數(shù)大于分區(qū),就會有消費(fèi)者空著。 消費(fèi)者數(shù)小于分區(qū),就會均衡消費(fèi)。
因?yàn)閗afka的設(shè)計(jì)是在一個(gè)partition上是不允許并發(fā)的,所以consumer數(shù)不要大于partition數(shù) ,浪費(fèi)。
如果consumer從多個(gè)partition讀到數(shù)據(jù),不保證數(shù)據(jù)間的順序性,kafka只保證在一個(gè)partition上數(shù)據(jù)是有序的,但多個(gè)partition,根據(jù)你讀的順序會有不同。
增減consumer,broker,partition會導(dǎo)致rebalance,所以rebalance后consumer對應(yīng)的partition會發(fā)生變化 。
消費(fèi)者組是為了不同組的消費(fèi)者可以同時(shí)消費(fèi)一個(gè)分區(qū)的消息。
replica
這是為了防止服務(wù)器掛掉。
分為兩類 leader replica 和 follow replica
只有 leader replica會響應(yīng)客戶端。
一旦leader replica所在的broker宕機(jī),會選出新的leader。
kafka保證一個(gè)partition的多個(gè)replica一定不會分配到同一臺broker上。
follow與leader實(shí)時(shí)同步。
ISR
in-sync replica 與leader replica保持同步的replica集合
正常時(shí),所有的replica都在ISR中,但如果響應(yīng)太慢,就會踢出ISR。之后追上來再加進(jìn)來。
ISR中至少有一個(gè)replica是活著的。
ISR中所有replica都收到消息,這個(gè)消息才是已提交狀態(tài)。
四、版本變化
