作者:朱小厮 来源:公众号朱小厮的博客

本文起源于之前去面试的一道面试题,面试题大致上是这样的:消费者去Kafka里拉去消息,但是目前Kafka中又没有新的消息可以提供,那么Kafka会如何处理?

如下图所示,两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结果给follower副本,不过在leader副本一直没有新消息写入的情况下,follower副本会一直发送拉取请求,并且总收到空的拉取结果,这样徒耗资源,显然不太合理。

这里就涉及到了Kafka延迟操作的概念。Kafka在处理拉取请求时,会先读取一次日志文件,如果收集不到足够多(fetchMinBytes,由参数fetch.min.bytes配置,默认值为1)的消息,那么就会创建一个延时拉取操作(DelayedFetch)以等待拉取到足够数量的消息。当延时拉取操作执行时,会再读取一次日志文件,然后将拉取结果返回给follower副本。

延迟操作不只是拉取消息时的特有操作,在Kafka中有多种延时操作,比如延时数据删除、延时生产等。

对于延时生产(消息)而言,如果在使用生产者客户端发送消息的时候将acks参数设置为-1,那么就意味着需要等待ISR集合中的所有副本都确认收到消息之后才能正确地收到响应的结果,或者捕获超时异常。

假设某个分区有3个副本:leader、follower1和follower2,它们都在分区的ISR集合中。为了简化说明,这里我们不考虑ISR集合伸缩的情况。Kafka在收到客户端的生产请求后,将消息3和消息4写入leader副本的本地日志文件,如上图所示。

由于客户端设置了acks为-1,那么需要等到follower1和follower2两个副本都收到消息3和消息4后才能告知客户端正确地接收了所发送的消息。如果在一定的时间内,follower1副本或follower2副本没能够完全拉取到消息3和消息4,那么就需要返回超时异常给客户端。生产请求的超时时间由参数request.timeout.ms配置,默认值为30000,即30s。

那么这里等待消息3和消息4写入follower1副本和follower2副本,并返回相应的响应结果给客户端的动作是由谁来执行的呢?在将消息写入leader副本的本地日志文件之后,Kafka会创建一个延时的生产操作(DelayedProduce),用来处理消息正常写入所有副本或超时的情况,以返回相应的响应结果给客户端。

延时操作需要延时返回响应的结果,首先它必须有一个超时时间(delayMs),如果在这个超时时间内没有完成既定的任务,那么就需要强制完成以返回响应结果给客户端。其次,延时操作不同于定时操作,定时操作是指在特定时间之后执行的操作,而延时操作可以在所设定的超时时间之前完成,所以延时操作能够支持外部事件的触发。

就延时生产操作而言,它的外部事件是所要写入消息的某个分区的HW(高水位)发生增长。也就是说,随着follower副本不断地与leader副本进行消息同步,进而促使HW进一步增长,HW每增长一次都会检测是否能够完成此次延时生产操作,如果可以就执行以此返回响应结果给客户端;如果在超时时间内始终无法完成,则强制执行。

回顾一下文中开头的延时拉取操作,它也同样如此,也是由超时触发或外部事件触发而被执行的。超时触发很好理解,就是等到超时时间之后触发第二次读取日志文件的操作。外部事件触发就稍复杂了一些,因为拉取请求不单单由follower副本发起,也可以由消费者客户端发起,两种情况所对应的外部事件也是不同的。如果是follower副本的延时拉取,它的外部事件就是消息追加到了leader副本的本地日志文件中;如果是消费者客户端的延时拉取,它的外部事件可以简单地理解为HW的增长。

延迟操作背后还有一些更深层次的内容,比如“炼狱”、“收割机”,至于.... 嘿嘿~~

计算发送延时与传播延迟_Kafka科普系列 | 轻松理解Kafka中的延时操作相关推荐

  1. Kafka科普系列 | 轻松理解Kafka中的延时操作

    欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-delay-operation/ 本文起源于之前去面试的一道面试题,面试题大 ...

  2. 计算机视觉系列-轻松掌握 MMDetection 中 全景分割算法 MaskFormer(一)

    计算机视觉系列-轻松掌握 MMDetection 中 全景分割算法 MaskFormer(一) 目录 全景分割 简介 MaskFormer 简介 MaskFormer 配置代码 计算机视觉学习笔记系列 ...

  3. mysql 伪表查询语句_MySql系列05:MySql中DQL查询操作

    1.表的准备 准备四张表: dept(部门表).emp(员工表).salgrade(薪资等级表).bonus(奖金表) create table DEPT( DEPTNO int(2) not nul ...

  4. matlab计算正负零序分量,5分钟教你正确理解电力系统中的正序负序零序.doc

    5分钟教你正确理解电力系统中的正序负序零序 电力 三相不平衡 作图法 对称分量法 1:三相不平衡的的电压(或电流),可以分解为平衡的正序.负序和零序 2:零序为3相电压向量相加,除以3 3:正序将BC ...

  5. 文件操作系列之三——(windows中的文件操作)

    前面介绍了标准C++和C Run-Time Library中文件操作的方式,缺点显而易见,很多的东西和验证需要我们自己进行. 在windows中,系统封装了这些运行库,然后给了我们几个可供使用的API ...

  6. React最佳实践系列 —— 循序渐进理解 Dva中的model概念

    Dva最佳实践 -- 循序渐进理解 Dva中的model概念 一. 序 二. 在create-react-app中使用redux 1. 开始 2. 安装redux 三.异步action 四. Dva中 ...

  7. Kafka科普系列 | 什么是LSO?

    欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-lso/ 很多同学对于Kafka的认知仅限于在LEO和HW之间,有可能认知还 ...

  8. 计算发送延时与传播延迟_消息队列——延时消息应用解析及实践

    简介:在大部分场景下业务系统如果只需要实现异步解耦.削峰填谷等能力,常规的普通消息就可以满足此类需求.除此之外,在某些特殊的业务场景中,普通消息类型存在无法满足需求的情况.这就需要消息队列服务本身支持 ...

  9. 科普系列:AUTOSAR与OSEK网络管理比较(下)

    在上篇中我们分别在状态机和报文格式方面对OSEK和AUTOSAR网络管理进行了简单介绍,感兴趣的小伙伴请移步至文章<科普系列:AUTOSAR与OSEK网络管理比较(上)>. 三.OSEK与 ...

最新文章

  1. 北大「最优化:建模、算法与理论」新书, 附579页电子版与课件
  2. 透视鹏程.盘古:首个2000亿参数中文大模型是怎样炼成的?
  3. lsqcurvefit拟合结果为复数_非线性拟合怎么转化为线性拟合?
  4. LeetCode 1838. 最高频元素的频数(二分查找)
  5. ubuntu阿里云快速下载
  6. php 取得user_agent,php通过$_SERVER['HTTP_USER_AGENT']获取浏览器相关参数(转)
  7. 关于ibatis的SQL注入。
  8. 项目管理必备文档大全:这14个项目文档你还不会写?
  9. 看不见你的笑我怎么睡得着
  10. 苹果战世界:苹果史上27大口水战
  11. 求线段或直线与圆的交点
  12. Vue 生成海报图的方法
  13. 3种在JavaScript中验证电子邮件地址的方法
  14. python读取图片的格式_python读取图片并修改格式与大小的方法
  15. R代码学习(5)——数据类型(字符串)
  16. 网络云存储技术Windows server 2012 (项目七 存储服务器重复数据删除的配置与管理)
  17. 2873-36-1,Gancidin W,CYCLO(L-LEU-L-PRO),cyclo-L-Leu-L-Pro,环(L-脯氨酰-L-亮氨酰)
  18. Python学习1-3
  19. MsgQ机制,实现H5游戏的模块彻底分离
  20. IOS 自动化探索——使用蓝牙实现 XCUITest 的 Tap 操作

热门文章

  1. UE3 Lightmass静态全局光照
  2. 分布式应用中的一致性协议
  3. 《大数据管理概论》一2.5 知识融合技术
  4. Linux(CentOS 6.5)下配置Mono和Jexus并且部署ASP.NET MVC5
  5. bluetooth记录
  6. html5访问电脑或手机摄像头
  7. 解决Error: Protected multilib versions:
  8. Android service 和 client的进程通信和消息回调--AIDL
  9. MSPlus DatePicker WebControl FreeVersion 1.1.0906 发布啦!
  10. js 获取当前gmt时间_javascript-如何将日期转换为GMT?