ReplicaFetcherThread是AbstractFetcherThread的子类,实现了对应的函数,它的定义如下:
class ReplicaFetcherThread(name: String, // 线程名称
// 单台 Broker 上,允许存在多个 ReplicaFetcherThread 线程。Broker 端参数 num.replica.fetchers,决定了 Kafka 到底创建多少个 Follower 拉取线程。
fetcherId: Int, // Follower 拉取的线程 Id,也就是线程的编号
sourceBroker: BrokerEndPoint, // 数据源Broker地址,即分区的leader是在哪个节点
brokerConfig: KafkaConfig, // 它封装了 Broker 端所有的参数信息。同样地,ReplicaFetcherThread 类也是通过它来获取 Broker 端指定参数的值。
failedPartitions: FailedPartitions, // 处理过程中出现失败的分区
replicaMgr: ReplicaManager, // 副本管理器。该线程类通过副本管理器来获取分区对象、副本对象以及它们下面的日志对象。
metrics: Metrics,
time: Time,
quota: ReplicaQuota, // 用做限流。用作 Follower 副本拉取速度控制
leaderEndpointBlockingSend: Option[BlockingSend] = None // 这是用于实现同步发送请求的类。
// 所谓的同步发送,是指该线程使用它给指定 Broker 发送请求,然后线程处于阻塞状态,直到接收到 Broker 返回的 Response。
)
extends AbstractFetcherThread(name = name,
clientId = name,
sourceBroker = sourceBroker,
failedPartitions,
fetchBackOffMs = brokerConfig.replicaFetchBackoffMs,
isInterruptible = false) {
// 副本Id就是副本所在Broker的Id
private val replicaId = brokerConfig.brokerId
private val logContext = new LogContext(s"[ReplicaFetcher replicaId=$replicaId, leaderId=${sourceBroker.id}, " +
s"fetcher