竹笋

首页 » 问答 » 问答 » Kafka成长记4Producer元数据
TUhjnbcbe - 2025/7/23 9:28:00

唤醒了阻塞的slct,你还记得阻塞后的逻辑么?

唤醒后会根据nioSlctor.slct()返回的adKys这个int数字,如果大于0如执行pollSlctionKys的一些操作,由于直接被wakUp(),实际adKys是0,所以poll方法直接就返回了,不会执行pollSlctionKys的处理。

而且Slctor的poll方法返回后,由于pollSlctionKys没有执行,所以之后一系列方法handlCompltdSnds、handlCompltdRcivs、handlDisconnctions、handlConnctions、handlTimdOutRqusts均没有执行。(你可以自己尝试断点下,就会发现。)

上面的逻辑执行完成,也就说第一次循环会结束,重新进行第二次循环。整体过程如下图所示:(主要执行了灰色的备注标注的流程)

文章配图

第二次循环maybUpdat执行的原因

既然进入第二次循环,就会重新执行将重新执行maybUpdat()、poll()、handl开头的这些方法。

你还记得maybUpdat的核心脉络么?它主要是根据3个时间决定了mtadataTimout是否为0,来决定是否执行。代码如下:

OvrridpubliclongmaybUpdat(longnow){//shouldwupdatourmtadata?longtimToNxtMtadataUpdat=mtadata.timToNxtUpdat(now);longtimToNxtRconnctAttmpt=Math.max(this.lastNoNodAvailablMs+mtadata.fshBackoff()-now,0);longwaitForMtadataFtch=this.mtadataFtchInProgss?Intgr.MAX_VALUE:0;//ifthisnonodavailabltoconnct,backofffshingmtadatalongmtadataTimout=Math.max(Math.max(timToNxtMtadataUpdat,timToNxtRconnctAttmpt),waitForMtadataFtch);if(mtadataTimout==0){//Bwathatthbhaviorofthismthodandth

1
查看完整版本: Kafka成长记4Producer元数据