onGroupLoaded更新member心跳
private def onGroupLoaded(group: GroupMetadata) {
group synchronized {
info(s"Loading group metadata for ${group.groupId} with generation ${group.generationId}")
assert(group.is(Stable))
group.allMemberMetadata.foreach(completeAndScheduleNextHeartbeatExpiration(group, _))
}
}
onGroupUnloaded在GroupMetadata被删除前,将ConsumerGroup状态切换成Dead,并根据之前的消费者组状态进行相应的清理操作。.
private def onGroupUnloaded(group: GroupMetadata) {
group synchronized {
info(s"Unloading group metadata for ${group.groupId} with generation ${group.generationId}")
val previousState = group.currentState
// 切换到Dead状态
group.transitionTo(Dead)
previousState match { // 根据Consumer Group之前的状态进行处理
case Dead =>
case PreparingRebalance =>
// 调用全部member的awaitingJoinCallback回调函数,返回指定错误码
for (member <- group.allMemberMetadata) {
if (member.awaitingJoinCallback != null) {
member.awaitingJoinCallback(joinError(member.memberId, Errors.NOT_COORDINATOR_FOR_GROUP.code))
// 清空awaitingSyncCallback回调函数
member.awaitingJoinCallback = null
}
}
// awaitingJoinCallback的变化,可能导致delayedJoin满足条件
joinPurgatory.checkAndComplete(GroupKey(group.groupId))
case Stable | AwaitingSync => // 类似PreparingRebalance
for (member <- group.allMemberMetadata) {
if (member.awaitingSyncCallback != null) {
member.awaitingSyncCallback(Array.empty[Byte], Errors.NOT_COORDINATOR_FOR_GROUP.code)
member.awaitingSyncCallback = null
}
heartbeatPurgatory.checkAndComplete(MemberKey(member.groupId, member.memberId))
}
}
}
}
本文详细解析了Kafka中消费者组的onGroupLoaded与onGroupUnloaded方法,阐述了如何更新成员心跳及在元数据卸载前进行状态切换和清理操作,确保消费组的稳定运行。
936

被折叠的 条评论
为什么被折叠?



