我们知道,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 timercancel()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分析相关推荐

  1. ReplicaManager分析

    一个broker可能分布多个Partition的副本信息,ReplicaManager主要负责管理一个broker范围内的Partition信息,然后它还根据Kafka Controller发送过来的 ...

  2. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  3. 2022-2028年中国自动驾驶系统行业现状调研分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国自动驾驶系统行业市场行业相关概述.中国自 ...

  4. 2022-2028年中国阻尼涂料市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻尼涂料行业市场行业相关概述.中国阻尼涂 ...

  5. 2021-2028年中国阻燃装饰行业市场需求与投资规划分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻燃装饰行业市场行业相关概述.中国阻燃装 ...

  6. 2022-2028年全球与中国漂白吸水棉市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国漂白吸水棉行业市场行业相关概述.全 ...

  7. 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国青苔清洗剂行业市场行业相关概述.全 ...

  8. 2022-2028年全球与中国氢碘化物市场智研瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国氢碘化物行业市场行业相关概述.全球 ...

  9. 2022-2028年全球与中国人字拖市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国人字拖行业市场行业相关概述.全球与 ...

最新文章

  1. mysql编程的二维数组_调出mysql中数据,输出一个二维数组的表格
  2. ubuntu18.04安装python3.7并将python3指向python3.7
  3. 逆向工程核心原理读书笔记-代码注入
  4. Sql Server 2005中的快照隔离
  5. html关于超链接的问题,关于超链接的一些问题
  6. 【Linux分享】Linux常用命令+教程分享
  7. oracle 拼接多个列_ORACLE实现类似mysql的find_in_set
  8. 数据结构基础(18) --哈希表的设计与实现
  9. linux scp限制传输速度
  10. BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)
  11. 微课--搭建单机版PySpark开发环境(8分钟)
  12. SLAM学习笔记 - ORB_SLAM2源码运行及分析
  13. Java常用JSON库FastJson,Gson,Jackson,Json-lib性能及特点比较,常用工具方法
  14. GRBL学习笔记2--grbl Arduino烧写
  15. 为什么打工人 996 会猝死,而企业家 007 却不会?
  16. 出版物设计排版工具:Swift Publisher 5 for Mac
  17. Linux (deepin)网络管理详解.
  18. 【如何7天写完一篇发明专利】
  19. 【龙芯1c库】封装gpio接口和使用示例
  20. 战略盲区,是看不见,还是不想看见?

热门文章

  1. Nginx核心模块ngx_http_proxy_module与nginx反向代理、负载均衡详解
  2. Java并发编程之线程安全性分析之原子性、可见性、有序性
  3. Java中如何编写一个完美的equals方法
  4. 3-17Pytorch与线性代数运算
  5. winform 中show()函数和showdialog()函数区别
  6. c#值get、 set用法(包含自动转换的说明)
  7. python数据收集整理教案_《数据收集整理(例1)》教案
  8. Mybatis 一对多关联查询collection用法
  9. pandas dataframe绘制并保存图像
  10. python列表转dict