技术大佬问我,kafka为什么这么的快?(2)

佩琪: 大佬,你昨天给讲了kafka 生产端和broker端 快的原因;但是还留了个尾巴,请问你上次说的 这个消费端的 批量拉取是什么意思了?

技术大佬 :(幸运上次到饭点,否则就尬死了,这个佩琪问题真多,没办法还需要继续装下去)

技术大佬 : 批量拉取:是指 消费端拉取broker消息时,不是每次获取单条消息,而是在从broker端获取消息时,尽量一次网络IO获取尽量多消息(默认最大上限为500条)。这也是kafka 使用"批量"这个提升系统吞吐量优化手段之一的体现;这里的消费端批量拉取和生产端使用的批量方式,有相似的效果,都是为了尽可能节约资源,把主要精力放到真正的消息处理里。

技术大佬 : 你不觉得 kafka把"批量"这个优化手段用到了极致吗?生产端批量发送消息;broker端也是把消息先写入pagecache暂存,然后通过定时刷新page cache里消息,顺序批量的把消息写入磁盘;消费者端也是批量的拉取消息到本地后进行消费**。**

佩琪: 好像还真是哦。 对了,大佬,为什么kafka要采用这种主动拉取消息的方式了,在我们 固有的认知里,不是应该broker 感知到了有消息后,主动推送消息到消费者端,这种更快的消息通知方式吗?

技术大佬 : 这个从kafka官方文档里,可推测一二;采用生产者推消息,消费者拉消息模式,主要是参考了业界其它消息系统采用的方式,即参考了前辈和友商的经验。

技术大佬 : 有个推和拉的对比,你要不学习下?

推模型 拉模型
数据及时性上 快。有数据立刻推送给消费者,速度在毫秒级 慢一个数量级。快慢取决于本地轮训时间间隔
数据延迟性上 低延迟 数据延迟,取决于本地轮训时间间隔
高负载性 消费者可能不可控:如果生产者产生数据的速率远远快于消费者处理数据速率;消费者有可能会被压到,导致数据丢失,或者处理端性能下降 消费者完全自主可控:允许消费者完全控制拉取数据的频率和数据量;在面对流量洪峰,也能适应其处理能力和需求
资源利用率上 高效:有数据才和消费者网络通信 较低效:即使没有消息也需要不断轮训broker端
网络兼容性上 低 :网络出现问题,需要频繁的推送 高:在不可靠的网络中更具优势,可以等待数据就绪后在进行拉取
消费者实现复杂度上 比拉模型简单,只需要被动接受数据 稍显复杂;需要定时拉取
broker端实现复杂度上 复杂,需要实现推送和数据传输机制,增加broker端复杂度 简单,被动接受查询;实现比推模型简单
数据处理速率上 处理效率低下:无批量处理,来一条推一条消息 高效:消费者可批量拉取数据,批量处理数据,提高了数据处理效率

佩琪: 对了大佬,你还说了最后一点 批量消息压缩是啥意思?

技术大佬 : 上次咱们不是说了,kafka 生产端是批量发送消息的;这个压缩,是指把这个批量消息作为一个整体进行压缩,然后通过一次网络IO发送给broker端。这种方式比不压缩,节约了网络带宽;并且在broker端存储的时候,也不会对消息进行解压,还节约了磁盘存储空间;另外压缩后的消息,直到消费者从broker端获取后,才会在消费者端进行解压缩。

这样就带来了,消息从生产端到broker端,再从broker端到消费者端的网络传输里,都是经过压缩的消息,从整体上节约了网络带宽和网络层传输的效率。

佩琪: 这好像看起来没啥了不起的,我们在业务层也可以进行单条消息压缩,最后批量发送出去,效果也是一样的呀

技术大佬 : 理论上和实际操作上都可行,但你不觉得这种方式的压缩比有点低吗?这种方式,可能会导致许多冗余是由于相同类型的消息之间的重复引起的。比如( JSON 中的字段名称、Web 日志中的用户代理或常见字符串值);本来这些在多个消息中可能重复的值,在单个消息里就有可能不会被压缩了。

佩琪: 摸摸猪头,原来如此,那还是先用kafka自带的压缩方式吧。

总结

联系上篇文章,下次再问我 kafka 这么快的原因,我会总结似的回答如下:

  1. 生产端:

    • 采用了异步提交消息的方式,加快了上层业务调用端的返回
    • 底层采用了 批量发送的方式,减少网络IO的次数。
  2. broker端

    • 写数据时,使用了同步写磁盘缓存+ 异步刷新数据到磁盘文件系统,提高了消息数据落到文件系统的速度;
    • 在读取消息时,使用零拷贝技术,减少磁盘IO读取次数,加快读消息过程
    • 利用broker天生的分布式能力,通过扩展硬件机器,带来消息发送和处理速度的提升。
  3. 消费端

    • 采用了批量拉取方式,一次IO拉取多条消息,加快消息传输和消息处理过程
  4. 端到端的批量压缩

    • 减少了消息在网络中给个节点的传输量,提升了网络层传输效率

    • 减少了broker端pagecache和磁盘的存储空间,提升了内存和磁盘的利用率

原创不易,请 点赞,留言,关注,收藏 4暴击^^

参考资料:

kafka 官方文档: kafka.apache.org/documentati...

相关推荐
FungLeo2 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
EatFan2 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
Csvn3 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_4 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt4 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
波力海苔夹心脆6754 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
JavaGuide5 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel5 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
莪_幻尘6 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm