kafka中partition和消費者對應關系

1個partition只能被同組的一個consumer消費,同組的consumer則起到均衡效果

消費者多于partition

topic: test 只有一個partition
創建一個topic——test,

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

在g2組中啟動兩個consumer,

1. bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer_g2.properties
2. bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer_g2.properties

消費者數量為2大于partition數量1,此時partition和消費者進程對應關系如下:

bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g2
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test 0 9 9 0 consumer-1-4a2a4aa8-32f4-4904-9c16-1c0bdf7128a2 /127.0.0.1 consumer-1
- - - - - consumer-1-fd7b120f-fd21-4e07-8c23-87b71c1ee8a5 /127.0.0.1 consumer-1

消費者consumer-1-fd7b120f-fd21-4e07-8c23-87b71c1ee8a5無對應的partition。
用圖表示為

生產者消費者對應關系1.jpg

如上圖,向test發送消息:1,2, 3,4,5,6,7,8,9
只有C1能接收到消息,C2則不能接收到消息,即同一個partition內的消息只能被同一個組中的一個consumer消費。當消費者數量多于partition的數量時,多余的消費者空閑。
也就是說如果只有一個partition你在同一組啟動多少個consumer都沒用,partition的數量決定了此topic在同一組中被可被均衡的程度,例如partition=4,則可在同一組中被最多4個consumer均衡消費。

消費者少于和等于partition

topic:test2包含3個partition

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic test2

開始時,在g3組中啟動2個consumer,

1.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties
2.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties

則對應關系如下:

TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test2 0 8 8 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
test2 1 7 7 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
test2 2 8 8 0 consumer-1-f362847d-1094-4895-ad8b-1e1f1c88936c /127.0.0.1 consumer-1

其中,consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c對應了2個partition
用圖表示為:

生產者消費者對應關系2.jpg

消費者數量2小于partition的數量3,此時,向test2發送消息1,2,3,4,5,6,7,8,9
C1接收到1,3,4,6,7,9
C2接收到2,5,8
此時P1、P2對對應C1,即多個partition對應一個消費者,C1接收到消息量是C2的兩倍
然后,在g3組中再啟動一個消費者,使得消費者數量為3等于topic2中partition的數量

3.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties

對應關系如下:

TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test2 0 8 8 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
test2 1 7 7 0 consumer-1-ab472ed5-de11-4e56-863a-67bf3a3cc36a /127.0.0.1 consumer-1
test2 2 8 8 0 consumer-1-f362847d-1094-4895-ad8b-1e1f1c88936c /127.0.0.1 consumer-1

此時,partition和消費者是一對一關系,向test2發送消息1,2,3,4,5,6,7,8,9
C1接收到了:2,5,8
C2接收到了:3,6,9
C3接收到了:1,4,7
C1,C2,C3均分了test2的所有消息,即消息在同一個組之間的消費者之間均分了!

多個消費者組

啟動g4組,僅包含一個消費者C1,消費topic2的消息,此時消費端有兩個消費者組

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g4.properties --delete-consumer-offsets

g4組的C1的對應了test2的所有partition:

bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g4
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test2 0 36 36 0 consumer-1-befc9234-260d-4ad3-b283-b67a2bf446ca /127.0.0.1 consumer-1
test2 1 35 35 0 consumer-1-befc9234-260d-4ad3-b283-b67a2bf446ca /127.0.0.1 consumer-1
test2 2 36 36 0 consumer-1-befc9234-260d-4ad3-b283-b67a2bf446ca /127.0.0.1 consumer-1

用圖表示為

生產者消費者對應關系3.jpg

如上圖,向test2發送消息1,2,3,4,5,6,7,8,9
那么g3組各個消費者及g4組的消費者接收到的消息是怎樣地呢?歡迎思考!!
答案:
消息被g3組的消費者均分,g4組的消費者在接收到了所有的消息。
g3組:
C1接收到了:2,5,8
C2接收到了:3,6,9
C3接收到了:1,4,7
g4組:
C1接收到了:1,2,3,4,5,6,7,8,9
啟動多個組,則會使同一個消息被消費多次

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,881評論 18 139
  • Kafka入門經典教程-Kafka-about云開發 http://www.aboutyun.com/threa...
    葡萄喃喃囈語閱讀 10,869評論 4 54
  • 一、Kafka簡介 Kafka (科技術語)。Kafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者規...
    邊學邊記閱讀 1,777評論 0 14
  • 我出生在江西的一個農村,在那自由自在長大,爸爸媽媽都是本分善良的農民,本分善良我不是隨便拿來用用的,他們的善良實在...
    無聲告白17號閱讀 607評論 0 0
  • 2016-07-20 也許,那是一種情愫,也許,那是一種信仰。 不知何時,院子里悄悄地多了棵梧桐樹,而它真正引起我...
    蘇雅will閱讀 358評論 0 0