我对Kafka高性能的四个关键点的理解

磁盘顺序读写, 省去寻址耗时, 一次寻址, 持续写入或读取, 提升磁盘IO性能

顺序读写, 每个日志段都从一个位置开始写入,只需要寻址一次就可以持续写入, 省去了磁盘IO的耗时大头: 寻址时间, 基于这个特性, Kafka的存储读写就使用顺序读写技术. 在写入时, 对于每个分区, kafka会将消息追加到日志上, 持续追加到一个日志段的最新位置上, 当一个日志满了, 再开辟一个新的日志, 继续顺序写下去. 类似的, 在消费时, 消费者也是从某个log文件的一个位置开始, 持续读取数据.

页缓存, 减少磁盘IO操作, 提升磁盘读写性能

页缓存是操作系统为磁盘建立的缓存, 无论使用什么程序语言, 应用程序的磁盘IO都是与pagecache打交道, 而尽可能的避免做直接磁盘IO读写操作, 通过缓存技术实现磁盘IO操作的异步化.

零拷贝, 减少冗余数据复制流程, 提升消费者性能

零拷贝也是操作系统提供的一种数据读写技术, 将数据从磁盘到网络传输的搬运全都在内核空间中完成, 避免从内核空间到用户空间冗余且需要CPU参与的数据拷贝动作, 从而提升性能.

批量操作技术, 辅以异步化, 提升消费与生产的消息性能, 同时减轻broker的压力, 提升负载

一次传输30条数据肯定比分30次传输30条数据效率要高的多, 避免减少了网络IO交互的频率, 也可以通过数据压缩等各种优化手段对数据进行优化处理, kafka在对数据的读写都采取了批处理技术, 同时批处理也是一种异步化的技术. 即: 在生产端,数据调用mafka的接口做消息发送, 但这条消息实际上并不会被真正的发送给服务端, 而是producer端先攒着, 等攒够了批处理的量才会被发送处理, 这实际上就是一种缓存加异步化的技术, 和页缓存的写没有本质的区别. 类似的消息消费, 数据一次拉取也是一批数据, 就类似于pagecache的预读特性, 每次加载一批数据, 然后缓存在消费者客户端, 从而减少网络IO的动作. 总体来说kafka的批处理技术不仅体现在网络IO上, 还有磁盘IO上, 消息的批量消费与生产大大的减轻了broker处理请求的次数, 比如处理一次新的网络请求的线程上下文切换的消耗或在网络中的耗时等, 从而提升了整体的吞吐量与处理能力.

相关推荐
MoFe115 分钟前
【.net core】【RabbitMq】rabbitmq在.net core中的简单使用
分布式·rabbitmq·.netcore
路飞说AI18 分钟前
Kafka消息不丢失全攻略
kafka
何中应27 分钟前
在windows本地部署RabbitMQ
分布式·消息队列·rabbitmq
Wild API32 分钟前
按任务轻重做模型分流的实战思路
分布式·微服务·架构
落子君1 小时前
kafka接受消息
kafka
下地种菜小叶1 小时前
接口幂等怎么设计?一次讲清重复提交、支付回调、幂等键与防重落地方案
java·spring boot·spring·kafka·maven
低客的黑调2 小时前
RabbitMQ-从入门到生产落地
分布式·rabbitmq
宸津-代码粉碎机2 小时前
Spring Boot 4.0虚拟线程实战续更预告:高阶技巧、监控排查与分布式场景落地指南
java·大数据·spring boot·分布式·后端·python
霖霖总总11 小时前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
ZC跨境爬虫12 小时前
Scrapy分布式爬虫(单机模拟多节点):豆瓣Top250项目设置与数据流全解析
分布式·爬虫·python·scrapy