消費分區(qū)
資料來源于網(wǎng)絡
消費者訂閱的入口:KafkaConsumer#subscribe
消費者消費的入口:KafkaConsumer#poll
處理流程:
對元數(shù)據(jù)重平衡處理:KafkaConsumer#updateAssignmentMetadataIfNeeded
協(xié)調(diào)器的拉取處理:onsumerCoordinator#poll
執(zhí)行已完成的【消費進度】提交請求的回調(diào)函數(shù):invokeCompletedOffsetCommitCallbacks()重平衡之前提交自己當前消費的信息:
更新發(fā)送心跳相關的時間:pollHeartbeat
確保消費者組活躍:AbstractCoordinator#ensureActiveGroup
是否需要加入組:joinGroupIfNeeded(timer);
發(fā)送入組請求:initiateJoinGroup、AbstractCoordinator#sendJoinGroupRequest
處理入組響應:JoinGroupResponseHandler
入組成功,自己被選為分配分區(qū)的 leader:AbstractCoordinator#onJoinComplete
重新分配分區(qū):AbstractPartitionAssignor#performAssignment,AbstractPartitionAssignor.assign
拉取消息:
拉取消息:org.apache.kafka.clients.consumer.KafkaConsumer#pollForFetches
本地拉?。篺etcher.collectFetch()
遠程拉?。簊endFetches();、client.poll
攔截返回:interceptors.onConsume
重平衡
作用是讓組內(nèi)所有的消費者知道自己應該消費那個分區(qū)或者它可以不用消費分區(qū),或者消費多個分區(qū),都是由重平衡機制來保證的。
也就是相當于是消費者的管家,給他派發(fā)消費那個分區(qū)的任務。
這下面這些時刻會觸發(fā):
- 組員變化:加入,退出,閃退
- 主題數(shù)量變化
- 主題分區(qū)數(shù)變化
要想實現(xiàn)消費者的重平衡勢必要和broker進行通信,在Kafka中是通過心跳機制來實現(xiàn)的,平衡的步驟:
- JoinGroup
在發(fā)送請求的時候:
請求當broker 告訴broker我要消費那個主題,并且協(xié)調(diào)器會收到以后會放入隊列。
當所以的消費者都發(fā)送JoinGroup以后,這個時候所有信息已經(jīng)收集到協(xié)調(diào)者,然后協(xié)調(diào)者來選一個leader。文章來源:http://www.zghlxwxcb.cn/news/detail-851473.html
協(xié)調(diào)者的響應:
協(xié)調(diào)者會選一個leader一般是先發(fā)起JoinGroup的消費者,這個時候協(xié)調(diào)器會告訴這個消費者去進行分區(qū)方案的生成。文章來源地址http://www.zghlxwxcb.cn/news/detail-851473.html
- SyncGroup
在發(fā)送請求的是時候有下面這兩種情況:
1 如果是leader 將分配好的方案給到協(xié)調(diào)器。
2 如果是非leader 只是要就協(xié)調(diào)者告訴自己應該消費那些分區(qū)。
協(xié)調(diào)者響應:
告訴消費者消費那些分區(qū)
圖片源于網(wǎng)絡
到了這里,關于消息隊列-Kafka-消費方如何分區(qū)與分區(qū)重平衡的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!