确保业务意图在网络中的正确实施
|
1、根据第一条消息的offset,通过OffsetIndex找到对应的消息所在的物理位置和大小。 2、获取LogOffsetMetadata,元数据包含消息的offset、消息所在segment的起始offset和物理位置 3、判断minOneMessage是否为true,若是则调整为必定返回一条消息大小,其实就是在单条消息大于maxSize的情况下得以返回,防止消费者饿死 4、再计算最大的fetchSize,即(最大物理位移-此消息起始物理位移)和adjustedMaxSize的最小值(这波我不是很懂,因为以上一波操作adjustedMaxSize已经最小为一条消息的大小了) 5、调用 FileRecords 的 slice 方法从指定位置读取指定大小的消息集合,并且构造FetchDataInfo返回
再来个流程图: 1、判断下当前日志段是否为空,空的话记录下时间,来作为之后日志段的切分依据 2、确保位移值合法,最终调用的是AbstractIndex.toRelative(..)方法,即使判断offset是否小于0,是否大于int最大值。 3、append消息,实际上就是通过FileChannel将消息写入,当然只是写入内存中及页缓存,是否刷盘看配置。 4、更新日志段最大时间戳和最大时间戳对应的位移值。这个时间戳其实用来作为定期删除日志的依据 5、更新索引项,如果需要的话(bytesSinceLastIndexEntry > indexIntervalBytes)
最后再来个流程图 indexIntervalBytes可以理解为插了多少消息之后再建一个索引,由此可以看出Kafka的索引其实是稀疏索引,这样可以避免索引文件占用过多的内存,从而可以在内存中保存更多的索引。对应的就是Broker 端参数log.index.interval.bytes 值,默认4KB。 实际的通过索引查找消息过程是先通过offset找到索引所在的文件,然后通过二分法找到离目标最近的索引,再顺序遍历消息文件找到目标文件。这波操作时间复杂度为O(log2n)+O(m),n是索引文件里索引的个数,m为稀疏程度。 这就是空间和时间的互换,又经过数据结构与算法的平衡,妙啊! 再说下rollJitterMs,这其实是个扰动值,对应的参数是log.roll.jitter.ms,这其实就要说到日志段的切分了,log.segment.bytes,这个参数控制着日志段文件的大小,默认是1G,即当文件存储超过1G之后就新起一个文件写入。这是以大小为维度的,还有一个参数是log.segment.ms,以时间为维度切分。 那配置了这个参数之后如果有很多很多分区,然后因为这个参数是全局的,因此同一时刻需要做很多文件的切分,这磁盘IO就顶不住了啊,因此需要设置个rollJitterMs,来岔开它们。 怎么样有没有联想到redis缓存的过期时间?过期时间加个随机数,防止同一时刻大量缓存过期导致缓存击穿数据库。看看知识都是通的啊!
日志段的写入 虽然手机电池材料方面已经多年没有进步,最近声量比较大的石墨烯电池也还未有厂商真正搭载商用,但充电技术的迭代已经让大部分用户不会对续航有什么抱怨。短期看,续航的优化还是在于快充技术和能耗,和电池有关的大革新依然很难出现。 外观:死磕色彩和后盖 触屏机的出现,应该是手机史上最大的革新之一,触摸屏的出现,不仅在外观上为手机创造了更多可能,还改变了人与手机的交互方式,一定程度上给后来的手机软件发展留出了巨大的空间。 前两年,大家在手机外观上的焦点还是全面屏,看谁屏占比高。有的厂商做出了双面屏方案,比如Nubia X,有的则做出了弹出式摄像头,比如OPPO Find X。现在,情势再变,旗舰机的发布会上,很难再看到某个厂商对屏占比大书特书。 从今年发布的各价位段机子来看,外观方面的博弈最激烈的还是配色和材质。华为P40系列的冰霜银、Nova 7系列的“7号色”、OPPO Find X2 Pro系列的竹青色、一加8 Pro的蓝调色。材质方面,塑料、玻璃后盖之外,越来越多的厂商开始尝试陶瓷、素皮等材质的后盖。 外观方面最不拘一格的更多还是游戏手机,比如黑鲨3、红魔5G,设计方面走的是与游戏贴合的流速线条设计风格,为了给用户营造一种炫酷、极速的视觉印象。 外观方面,屏占比越来越低(摄像头位置多变)、配色越来越稀有应该是未来的两大主流发展趋势。尽管有了第二块屏幕的实践,但智能手机的外观已经基本定型,即使是折叠手机,其实也未在外观上有很大的变化。
芯片和系统:按部就班的升级 (编辑:烟台站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


