![](https://img-blog.csdnimg.cn/20200920224849526.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Kafka-0.10
kafka源码
其实系一个须刨
这个作者很懒,什么都没留下…
展开
-
DelayedOperationPurgatory机制(八):零拷贝
在消费者获取消息时,会有IO读写和网络发生,主要步骤如下:1. 应用程序调用read方法从用户态切换到内核态,将数据从磁盘上读取出来保存在内核缓冲区中。2. 内核缓冲区的数据传输到应用程序,此时read方法调用结束,从内核态转换成用户态3. 应用程序执行send方法,从用户态切换到内核态,将数据传输给Socket Buffer4. 最后,内核将Socket Buffer中的数据发送NIC ...原创 2019-10-09 00:08:27 · 193 阅读 · 0 评论 -
Kafka GroupCoordinator机制(六):GroupMetadataManager之syncGroupGroupRequest处理
ConsumerGroup中的leader消费者会通过syncGroupRequest将分区的分配结果发送给GroupCoordinator,GroupCoordinator会根据这个分配结果形成SyncGroupResponse返回给所有的消费者。消费者受到解析后得到分区的分配结果。prepareStoreGroup()方法实现了根据分区分配结果创建消息消息的功能。def prepareS...原创 2019-10-03 23:43:34 · 636 阅读 · 0 评论 -
Kafka GroupCoordinator机制(五):GroupMetadataManager之GroupCoordinator迁移
当leader所在的副本broker出现故障的时候,会发送GroupCoordinator迁移,在handleLeaderAndISRRequest方法中实现 def handleLeaderAndIsrRequest(request: RequestChannel.Request) { // ensureTopicExists is only for client facing ...原创 2019-10-03 23:42:23 · 483 阅读 · 0 评论 -
Kafka GroupCoordinator机制(四):GroupMetadataManager之查找GroupCoordinator
消费者与GroupCoordinator进行交互之前,首先会发送GroupCoordinatorRequest到负载较小的broker,目的是查询管理其所在ConsumerGroup对应的Coordinator的网络位置。之后,消费者会连接到GroupCoordinator,发送剩余的JoinGroupRequest和SyncGroupRequest。handleGroupCoordinator...原创 2019-10-03 23:41:25 · 518 阅读 · 0 评论 -
Kafka GroupCoordinator机制(三):GroupMetadataManager之groupsCache管理和offsetsCache管理
记录groupMetadata信息的消息和记录消费offset位置的消息都是通过partitionFor()选择合适的分区,他们的会分到同一个__CONSUMER_OFFSETS中。GroupMetadataManager提供了对于groupsCache集合的管理方法,这里特别介绍removeGroup。把GroupMetadata对象删除,向__CONSUMER_OFFSET中写入一个val...原创 2019-10-03 23:39:58 · 357 阅读 · 0 评论 -
Kafka GroupCoordinator机制(二):GroupMetadataManager介绍
GroupMetadataManager是GroupCoordinator中管理ConsumerGroup元数据以及对应offset信息的组件。GroupMetadataManager底层使用offsetsTopic,以消息的形式储存Consumer Group的GroupMetadata信息以及消费者每个分区的offsetclass GroupMetadataManager(val bro...原创 2019-10-03 23:38:28 · 979 阅读 · 0 评论 -
Kafka GroupCoordinator机制(一):GroupCoordinator简介
GroupCoordinator在每个Broker上都会实例化一个对象,Kafka按照ConsumerGroup的名称将其分配给对应的GroupCoordinator进行管理,每个GroupCoordinator只负责管理ConsumerGroup的一个子集,而非集群中全部的ConsumerGroup。GroupCoordinator有几项重要的功能1. 负责处理JoinGroupReques...原创 2019-10-03 23:34:39 · 2833 阅读 · 0 评论 -
KafkaController机制(十三):ControlledShutdownRequest
KafkaController.shutdownBroker()方法时ControlledShutdownRequest的核心,使用ControlledShutdownLeaderSelector重新选择Leader副本和ISR集合,实现Leader副本的迁移。 def shutdownBroker(id: Int) : Set[TopicAndPartition] = { ...原创 2019-09-26 00:20:48 · 396 阅读 · 0 评论 -
KafkaController机制(十二):KafkaController初始化与故障转移
在kakfa的集群中,只有一个Controller能够成为Leader管理整个集群,而其他未成为ControllerLeader的Broker也会创建一个KafkaController对象,他们唯一能做的事情就是当leader发生故障的时候竞争成为新的Controller。KafkaController的启动和故障转移的过程与ZookeeperLeaderElector有着密切的关系,Zooke...原创 2019-09-26 00:20:18 · 1724 阅读 · 0 评论 -
KafkaController机制(十一):Zookeeper Listener之PartitionReassignedListener
PartitionReassignedListener监听的是/admin/reassignment_partitionsclass PartitionsReassignedListener(controller: KafkaController) extends IZkDataListener with Logging { this.logIdent = "[PartitionsRea...原创 2019-09-26 00:15:42 · 213 阅读 · 0 评论 -
KafkaController机制(十):Zookeeper Listener之PrefferedReplicaElectionListener
PrefferedReplicaElectionListener负责监听/admin/preferred_replica_election,当需要进行优先副本选举的时候回指定分区的信息写入这个这个节点,然后触发PrefeeredReplicaElectionListener进行处理。class PreferredReplicaElectionListener(controller: Kafk...原创 2019-09-25 01:12:37 · 224 阅读 · 0 评论 -
KafkaController机制(九):Zookeeper Listener之IsrChangeNotificationListener
监听/isr_change_notification路径下的节点 override def handleChildChange(parentPath: String, currentChildren: util.List[String]): Unit = { import scala.collection.JavaConverters._ inLock(controlle...原创 2019-09-25 01:12:00 · 369 阅读 · 0 评论 -
KafkaController机制(八):Zookeeper Listener之BrokerChangeListener
BrokerChangeListener是ReplicaStateMachine中唯一个ZookeeperListner,他会监听/broker/ids节点下的子节点的变化,主要负责处理Broker上线和故障下线,上线时在/broker/ids下创建临时节点,下线时删除.def handleChildChange(parentPath : String, currentBrokerList ...原创 2019-09-25 01:11:25 · 222 阅读 · 0 评论 -
KafkaController机制(七):Zookeeper Listener之PartitionModificationsListener
在新增Topic时会给每个Topic注册一个PartitionModificationsListener,监听/brokers/topics/topic_NAME节点的子节点变化,主要是监听Topic分区的变化。PartitionModificationsListener不对删除分区进行处理.def handleDataChange(dataPath : String, data: Obje...原创 2019-09-25 01:10:29 · 106 阅读 · 0 评论 -
KafkaController机制(六):Zookeeper Listener之TopicDeletionManager与DeleteTopicsListener
KafkaCtroller会通过Zookeeper监控整个kafka集群的运行状。TopicChangeListener负责管理topic的增删,监听/brokers/topics节点的子节点变化。 /** * This is the zookeeper listener that triggers all the state transitions for a partition...原创 2019-09-25 01:09:08 · 252 阅读 · 0 评论 -
KafkaController机制(五):ReplicaStateMachine
ReplicaStateMachine是Controller Leader用来维护副本状态的状态机,副本有7种不同的状态NewReplica:创建新Topic或者进行副本分区分配时,新创建的副本就处于这个状态,处于这个状态的副本只能成为Follower副本。OnlineReplica:副本开始正常工作时的状态,处在此状态的副本可以成为leader或者followerOfflineReplic...原创 2019-09-25 01:03:47 · 332 阅读 · 0 评论 -
KafkaController机制(四):PartitionLeaderSelector
PartitionMachine把Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现。/** * Select the new leader, new isr and receiving replicas (for the LeaderAndIsrRequest): * 1. If at least one broker from t...原创 2019-09-25 01:02:38 · 270 阅读 · 0 评论 -
Kafka GroupCoordinator机制(七):GroupMetadataManager之OffsetCommitRequest处理
消费者正在进行正常的消费过程中以及rebalance操作之前,都会进行提交offset的操作,其操作任务是将消费者的每个分区对应的offset封装成offsetCommitRequest发送给GroupCoordinator,GroupCoordinator会把这些offset封装成消息,追加到对应的__CONSUMER_OFFSET中。在GroupCoordinatorManager与offse...原创 2019-10-03 23:44:12 · 394 阅读 · 0 评论 -
Kafka GroupCoordinator机制(八):GroupMetadataManager之OffsetFetchRequest和ListGroupsRequest处理
当Consumer Group宕机后重新上线时,可以通过向GroupCoordinator发送OffsetFetchRequest获取最近一次提交的offset,并从这个位置开始重新消费。GroupCoordinator在收到offsetFetchRequest后会交给GroupMetadataManager进行处理,他会根据请求中的groupID查找对应的OffsetAndMetadata对象,...原创 2019-10-03 23:45:11 · 523 阅读 · 0 评论 -
DelayedOperationPurgatory机制(七):DelayedFetch实现
DelayFetch的主要字段如下:class DelayedFetch( // 延迟操作的延迟时长 delayMs: Long, // 为FetchRequest中所有相关分区记录了相关状态,主要用来判断DelayedProduce是否满足执行条件 ...原创 2019-10-09 00:08:24 · 272 阅读 · 0 评论 -
DelayedOperationPurgatory机制(六):DelayedFetch之fetchMessages
DelayedFetch是FetchRequest对应的延迟操作,它的原理与DelayedProduce类似。消费者发送fetchRequest有KafkaApis.handleFetchRequest方法处理,他会调用FeplicaManager.fetcherMessages()方法从响应的log里读取消息,并生成delayedFetch添加到delayedFetchPurgatory中处理,...原创 2019-10-09 00:08:18 · 233 阅读 · 0 评论 -
DelayedOperationPurgatory机制(五):DelayProduce实现
DelayedProduce的字段分析如下:class DelayedProduce( // DelayedProduce的延迟时长 delayMs: Long, // ProduceMetadata为一个ProducerRequest中所有相关分区记录了一些追加消息...原创 2019-10-09 00:08:14 · 272 阅读 · 0 评论 -
DelayedOperationPurgatory机制(四):DelayProduce之appendMesaages
生产者把消息发送到服务端时,KafkaApis会调用hadleProducerRequest方法,他会调用ReplicaManager.appendMessages方法将消息追加到Log中,生成相应的DelayedProduce对象并添加到delayedProducePurgatory中处理,下面介绍一下appendMesaages方法 def appendMessages(timeout...原创 2019-10-09 00:08:09 · 190 阅读 · 0 评论 -
DelayedOperationPurgatory机制(三):DelayedOperation
DelayedOperation是一个延迟异步的操作,它有四个实现类:DelayedProduce、DelayedFetch、DelayedJoin、DelayedHeartbeatonComplete():抽象方法,DelayedOperation的业务逻辑。forceCompleted():如果DelayedOperation没有完成,则将任务从时间轮中删除,然后调用onComplete...原创 2019-10-05 01:05:19 · 286 阅读 · 0 评论 -
DelayedOperationPurgatory机制(二):SystemTimer
SystemTimer是kafka中定时器的实现,它在TimeWheel的基础上添加了执行到期任务、阻塞等待最近到期任务的功能class SystemTimer(executorName: String, tickMs: Long = 1, wheelSize: Int = 20, s...原创 2019-10-05 01:03:45 · 134 阅读 · 0 评论 -
DelayedOperationPurgatory机制(一):TimingWheel
DelayedOperationPurgatory是一个相对独立的组件,主要功能是管理延迟操作。因jdk提供的timer和delayedQueue无法支持大量的定时任务,所以kafka自己实现了延迟组件。TimingWheel是以储存定时任务的环形队列,底层使用数组实现,数组中的每个元素可以存放一个TimerTaskEntry中封装了真正的定时任务TimerTask。TimerTaskList使...原创 2019-10-05 01:01:59 · 238 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十七):GroupCoordinator之onGroupLoaded和onGroupUnloaded分析
onGroupLoaded更新member心跳 private def onGroupLoaded(group: GroupMetadata) { group synchronized { info(s"Loading group metadata for ${group.groupId} with generation ${group.generationId}")...原创 2019-10-05 00:29:02 · 287 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十六):GroupCoordinator之LeaveGroupRequest分析
消费者离开消费者组是向GroupCoordinator发送LeaveGroupRequest。 def handleLeaveGroup(groupId: String, consumerId: String, responseCallback: Short => Unit) { if (!isActive.get) { responseCallback(Erro...原创 2019-10-05 00:28:58 · 1710 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十五):GroupCoordinator之OffsetCommitRequest分析
OffsetCommitRequest处理消费者提交的offset def handleOffsetCommitRequest(request: RequestChannel.Request) { val header = request.header val offsetCommitRequest = request.body.asInstanceOf[OffsetCom...原创 2019-10-05 00:28:53 · 530 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十四):GroupCoordinator之SyncGroupRequest分析
服务端对SyncGroupRequest的处理是rebalance的第三步,API层由KafkaApi.handleSyncGroupRequest方法负责处理SyncGroupRequest,其中会定义相关的回调函数,并将请求交给GroupCoordinator.handleSyncGroupRequest方法负责处理SyncGroupRequest,其中会定义相关的回调函数,并将请求交给Gro...原创 2019-10-05 00:28:49 · 791 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十三):GroupCoordinator之HeartbeatRequest分析
每个消费者都会通过HeartbeatTask任务定时向GroupCoordinator发送heartbeatRequest,告知GroupCoordinator自己正常在线。HeartBeatRequest首先由KafkaApi.handleHeartbeatRequest方法进行处理,它负责验证权限,定义回调函数,并将请求委托给GroupCoordinator处理。 def handl...原创 2019-10-05 00:28:42 · 887 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十二):GroupCoordinator之GroupState之DelayedJoin分析
消费者组的状态切换成prepareRebalance会创建一个DelayedJoin的对象,添加到GroupCoordinator.joinPurgatory中管理,它是一种延迟操作,主要功能是等待消费者组中所有消费者发送joinGroupRequest申请加入。每当处理完新接收到的joinGroupRequest时,都会检测相关的delayedJoin是否能够完成,经过一段时间,delayedJ...原创 2019-10-05 00:28:26 · 330 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十一):GroupCoordinator之GroupState之JoinGroupRequest分析
rebalance的第二个步骤是消费者向GroupCoordinator发送JoinGroupRequest,这里分析GroupCoordinator如何处理JoinGroupRequest def handleJoinGroupRequest(request: RequestChannel.Request) { import JavaConversions._ //解析J...原创 2019-10-05 00:28:16 · 745 阅读 · 0 评论 -
Kafka GroupCoordinator机制(十):GroupCoordinator之GroupState
GroupState接口用于表示消费者组的状态,四个子类分别代表四个不同的状态:PreparingRebalance:消费者组正在进行rebalance操作当消费者处于这个状态时,GroupCoordinator可以正常处理offsetFetchRequest、leaveGroupRequest、offsetCommitRequest,但对于收到heartbeatrequest和SyncGr...原创 2019-10-03 23:51:16 · 448 阅读 · 0 评论 -
Kafka GroupCoordinator机制(九):GroupCoordinator
GroupCoordinator主要字段如下:class GroupCoordinator(val brokerId: Int, // GroupConfig类型,记录了消费者组中consumer session过期的最小时长和最大时长。 val groupConfig: GroupConfig, ...原创 2019-10-03 23:47:17 · 533 阅读 · 0 评论 -
KafkaController机制(三):PartitionStateMachine
PartitionStateMachine是Controller Leader用于维护分区状态的状态机,分区状态是通过PartitionState定义的,它有四个子类分别代表四种可能的状态NonExistentPartition:分区从来没有被创建,或者创建之后又被删除了NewPartition:分区被创建后处于此状态,此时分区已经被分配了AR集合,但是还没有制定Leader副本和ISROf...原创 2019-09-25 01:01:40 · 880 阅读 · 0 评论 -
KafkaController机制(二):ControllerContex t& ControllerBrokerRequestBatch
ControllerContextControllerContext维护了Controller使用到的上下文信息,从其构造函数也能猜到,ControllerContext与Zookeeper有密切关系,可以把ControllerContextkan看成是Zookeeper数据的缓存。class ControllerContext(val zkUtils: ZkUtils, ...原创 2019-09-25 00:58:09 · 178 阅读 · 0 评论 -
KafkaController机制(一):KafkaControllerChannelManager
KafkaControllerChannelManager在多个brokers中,有一个brokers会诶选举为controller Leader,负责管理整个集群中所有的分区和副本的状态。例如,当分区的leader副本出现故障时,由controller负责为该分区的重新选举新的leader副本,isr集合发生变化时,由controller通知其他brokers更新MetadataCache信息...原创 2019-09-25 00:55:46 · 400 阅读 · 0 评论 -
kafka日志存储(五):LogSegment
为了防止Log文件过大,把log切分成很多个日志文件,每个日志文件对应一个LogSegment,在LogSegment中封装一个FileMessageSet和OffsetIndex对象。class LogSegment(val log: FileMessageSet,//操作对应日志文件FileMessageSet对象 val index: Offset...原创 2019-06-23 23:34:30 · 476 阅读 · 0 评论 -
kafka日志存储(四):OffsetIndex
为了提高查找消息的性能,kafka在0.8 后为每个日志文件添加了对应的索引文件,OffsetIndex对象对应管理磁盘上的一个索引文件,预FileMessageSet共同构成了一个LogSegment对象。OffsetIndex字段有:class OffsetIndex(@volatile private[this] //指向磁盘上的索引文件。 var _file: F...原创 2019-06-23 23:33:08 · 627 阅读 · 0 评论