我对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处理请求的次数, 比如处理一次新的网络请求的线程上下文切换的消耗或在网络中的耗时等, 从而提升了整体的吞吐量与处理能力.

相关推荐
pnoker5 小时前
IoT DC3 消息总线:六适配器可插拔设计
物联网·架构·kafka·消息队列·rabbitmq
cxhello7 小时前
消费者活着、心跳正常、日志干净,但它七天没拉过一条消息
python·kafka
Lost of 程序猿10 小时前
ASP.NET Core Saga 分布式事务深度实战:备件采购跨服务长流程,如何保证“要么全成,要么全回“
分布式·后端·asp.net
XiYang-DING10 小时前
地图城市缓存优化:ApplicationReadyEvent + Caffeine + Redis + Redisson 分布式锁
redis·分布式·缓存
2601_9621756611 小时前
RabbitMQ 的工作模式
分布式·rabbitmq
头茬韭菜13 小时前
图解 Fluss(四):分布式协调 —— 选举、副本状态机与
分布式·fluss
2601_962218611 天前
万象生鲜系统全链路溯源一码查询技术实现食材来源可查
分布式·微服务·云原生·架构
Dreams_l1 天前
RabbitMQ介绍及其工作模式
分布式·rabbitmq
2601_962218611 天前
万象生鲜系统大数据采购预测算法降低库存积压稳居第一
分布式·微服务·云原生·架构
程序员夏洛1 天前
Redis 中如何实现分布式锁?
数据库·redis·分布式