DelayedOperation分析
来源:互联网 发布:淘宝1.74非球面镜片 编辑:程序博客网 时间:2024/05/16 03:17
我们知道,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 defrun(): 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()
- DelayedOperation分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 大家帮忙分析分析!
- FFMpeg分析详细分析
- FFMpeg分析详细分析
- core 分析的分析
- 写给自己,分析分析
- FFMpeg分析详细分析
- 图像分析------直方图分析
- 静态分析 - 数据流分析
- jquery对象怎么转换为html对象(也就是js的dom对象)
- 在windows上 部署 Redis cluster模式的集群服务
- ASP.NET页面传值汇总 (Session / Server.Transfer / Query String / Cookie / Application )
- 2017.06.01回顾
- Linux下获取文件大小,检索目录函数
- DelayedOperation分析
- eclipse 快捷键失效 Ctrl+S Ctrl+F Ctrl+Z
- input子系统基础之按键1——什么是input子系统?
- 两数之和
- c++基础杂记
- php开源项目 http://www.phpky.cn/ [记录]
- windows10 环境下 opencv3.0.0+opencv_contrib重编译
- linux nginx配置https
- codeblocks配置cuda