DelayedOperation分析

我们知道,ProducerRequest和 FetchRequest两种请求,服务端在收到这请求时候,并不是立即响应返回,可能会等待一段时间才返回。

 

对于ProducerRequest来说,其中acks设置为-1,表示ProducerRequest

发送到leader之后,需要ISR集合中所有副本都同步该请求中消息(或者超时了)才能返回响应给客户端. ISR集合中的副本分布在不同的broker上,与leader同步就涉及到网络通信,一般情况下网络传输可能是一个耗时的过程,通常采用异步方式来处理,避免线程长时间等待

 

当FetchRequest发送到leader之后,会积累一定的消息才返回给消费者或者follower副本,并不是leader副本HighWatermark后移一条消息就立即返回给消费者,这是为了实现了批量消息发送

 

Kafka利用SystemTimer来定期检查请求超时,但这些请求真正目的并不是超时执行,而是为了满足其他条件后执行,所以SystemTimer已经无法满足需求。随意Kafka使用DelayedOpeartion来抽象延迟操作,对TimerTask做了一些扩展,除了有定时执行的功能,还提供检测其他条件执行的功能

 

核心方法:

# run: DelayedOperation到期时会提交到SystemTimer.taskExecutor线程执行,其中会调用forceComplete方法完成延迟操作,然后调用onExpiration方法执行延迟操作到期执行

override def run(): Unit = {
  if (forceComplete())
    onExpiration()
}

# onExpiration:DepayedOpearion到期时执行的具体逻辑

def onExpiration(): Unit

 

# forceComplete: 如果DelayedOperation没有完成,则先将任务从时间轮删除到,然后调用onCompleted方法执行具体的业务逻辑

def forceComplete(): Boolean = {
  if (completed.compareAndSet(false, true)) {
    // cancel the timeout timer
    cancel()
    onComplete()
    true
  } else {
    false
  }
}

 

# tryComplete: 子类根据自身类型,检测执行条件是否满足,若满足则回调用forceComplete方法完成延迟操作

def tryComplete(): Boolean

 

# onComplete: DelayedOperation具体的业务逻辑,比如DeplayedProduce中该方法实现就是向客户端返回ProduceResponse,该方法只能被forceComplete方法中被调用,且在DelayedOperation生命周期中只能被调用一次

def onComplete(): Unit

 

# isCompleted: 检测是任务是否完成

def isCompleted: Boolean = completed.get()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值