Kafka是一個 分布式的、可分區(qū)的、可復制的消息系統(tǒng)。它提供了普通消息系統(tǒng)的功能,但具有自己獨特的設(shè)計。
首先來了解一下Kafka所使用的基本術(shù)語:
Topic
Kafka將消息種子(Feed)分門別類, 每一類的消息稱之為話題(Topic).
Producer
發(fā)布消息的對象稱之為話題生產(chǎn)者(Kafka topic producer)
Consumer
訂閱消息并處理發(fā)布的消息的種子的對象稱之為話題消費者(consumers)
Broker
已發(fā)布的消息保存在一組服務器中,稱之為Kafka集群。集群中的每一個服務器都是一個代理(Broker). 消費者可以訂閱一個或多個話題,并從Broker拉數(shù)據(jù),從而消費這些已發(fā)布的消息。
partition
每一個分區(qū)都是一個順序的、不可變的消息隊列, 并且可以持續(xù)的添加。分區(qū)中的消息都被分配了一個序列號,稱之為偏移量(offset),在每個分區(qū)中此偏移量都是唯一的。 Kafka集群保持所有的消息,直到它們過期, 無論消息是否被消費了。
Client和Server之間的通訊是通過一條簡單、高性能并且?和開發(fā)語言無關(guān)的TCP協(xié)議
生產(chǎn)者(Producer)
生產(chǎn)者往某個Topic上發(fā)布消息。生產(chǎn)者也負責選擇發(fā)布到?Topic上的哪一個分區(qū)。最簡單的方式從分區(qū)列表中輪流選擇。也可以根據(jù)某種算法依照權(quán)重選擇分區(qū)。開發(fā)者負責如何選擇分區(qū)的算法。
消費者(Consumers)
Topic分區(qū)中消息只能由消費者組中的唯一一個消費者處理,所以消息肯定是按照先后順序進行處理的。但是它也僅僅是保證Topic的一個分區(qū)順序處理,不能保證跨分區(qū)的消息先后處理順序。 所以,如果你想要順序的處理Topic的所有消息,那就只提供一個分區(qū)。
kafka的保證
- 生產(chǎn)者發(fā)送到一個特定的Topic的分區(qū)上的消息將會按照它們發(fā)送的順序依次加入
- 消費者收到的消息也是此順序
- 如果一個Topic配置了復制因子( replication facto)為N, 那么可以允許N-1服務器宕機而不丟失任何已經(jīng)增加的消息
消息傳遞保障
- 最多一次 --- 消息可能丟失,但永遠不會重發(fā)
- 至少一次 --- 消息絕不會丟失,但有可能重新發(fā)送
- 正好一次 --- 這是人們真正想要的,每個消息傳遞一次且僅一次
性能
3臺kafka集群 3臺customer(生產(chǎn)者或者消費者):
CPU:8 vCPU, Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
內(nèi)存:16 GB
磁盤:500 GB
實驗條件:3個Broker,1個Topic,6個Partition,無Replication,異步模式,消息Payload為100字節(jié)
測試項目:測試1個Producer和1個Consumer同時工作時Consumer所能消費到的消息量
測試結(jié)果:1,215,613 records/second
#######優(yōu)點和缺點
優(yōu)點
- 高吞吐率
- 分布式,高擴展性
- 容錯性
- 持久性,可靠性
- 高并發(fā): 支持數(shù)千個客戶端同時讀寫