深入分區(qū)
Topic至少有一個(gè)分區(qū)、可以有多個(gè)分區(qū)。通過創(chuàng)建時(shí)的參數(shù)
--partitions
來指定分區(qū)數(shù)。消息被添加到分區(qū)中時(shí)舅逸,會(huì)有一個(gè)偏移量
offset
來唯一標(biāo)識(shí)一條消息。因此同一個(gè)分區(qū)內(nèi)的消息是順序的皇筛,不同分區(qū)中的消息順序無法保證琉历。下圖中展示了該topic有3個(gè)分區(qū),每條消息在被添加到分區(qū)中時(shí)都有唯一的
offset
-
topic分區(qū)中的消息存儲(chǔ)在日志文件中设联,而且有過期時(shí)間善已,在
server.properties
文件中配置,默認(rèn)保存7天离例。log.retention.hours=168
-
分區(qū)的設(shè)計(jì)可以提高kafka的消息吞吐量TPS:
- 容易水平擴(kuò)展换团,只需增加新的broker,建立新的分區(qū)宫蛆,就可以接收同一個(gè)topic的消息
- 同一個(gè)topic的信息會(huì)發(fā)送到該topic的不同分區(qū)艘包,并行處理消息。
分區(qū)實(shí)例
-
首先依次啟動(dòng)zookeeper和kafka耀盗,并使用下面的命令創(chuàng)建一個(gè)有3個(gè)分區(qū)的topic想虎。
bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic topic5 --replication-factor 1 --partitions 3
-
啟動(dòng)一個(gè)producer,并發(fā)送一系列消息
可以看到叛拷,consumer接收到的消息是不連續(xù)的舌厨,這正是分區(qū)導(dǎo)致的:
producer向3個(gè)分區(qū)寫入消息,consumer從3個(gè)分區(qū)拉取消息忿薇。分區(qū)內(nèi)的消息通過offset
保證連續(xù)裙椭,但分區(qū)之間的消息順序無法保證。