`

Kafka使用心得(3)—Kafka性能解剖

 
阅读更多

Kafka技术介绍

 

1. PULL VS PUSH

 

      pull和push是两种消息传输方式,各有优缺点。Flume采用了push的方式进行消息传输,对注册后的客户端,主动发送收到的消息。而Kafka采用了传统的消息队列的方式,生产者使用push方式,消费者使用pull方式。

       对于生产者来说,Kafka集群的处理能力要远远超过自己,因此可以很放心的进行push。而对于消费者来说,Kafka可以同时支持不同的消费者组,而不同消费者的处理能力也不尽相同,因此为了减轻系统复杂度,对于消费者Kafka采用了pull方式。

 

2.  消息持久化

 

Kafka将消息持久化到磁盘,传统观念上磁盘的速度非常慢,对于追求高吞吐量的系统来说使用磁盘并不是明智的选择。但Kafka仍然选择了磁盘,并且实现了高速的读写。主要有以下几个原因:

  • 消息使用Append进行写
  • 读取消息的时间复杂度为O(1)
  • 读写的过程使用了mmap
  • ZeroCopy
  • 支持消息压缩

2.1 Append写

 

实验证明,磁盘速度慢的原因是因为寻道耗时非常大,但顺序读写的速度是非常快的,Kafka设计的一个重要优点在于消息的顺序读写。



 

从图中能看到,每次写消息,都是向文件尾部进行追加的。

 

2.2 消息读取时间复杂度

 

Kafka所有文档介绍时间复杂度是O(1),它的消息存储结构为:

 



 

消息目录下存储着以topic-partitionId命名的目录,每个目录下存储按照一定规则切割的segment文件。文件名为第一个消息的offset.kafka。

 

每条消息内容为:消息头+magic+crc+body。

 

读取的时候给定一个offset,可以从zk获取到对应的消息文件,通过计算offset和文件名的差值,可以算出来偏移量,根据消息的大小定位出消息的地址。

 

2.3 ZeroCopy

 

 kafka的消息存储和读取使用了cache技术,每次是先写到cache,每隔一定时间或者达到一定量会flush到磁盘。使用了mmap技术。

 

Linux使用了分页管理,mmap技术将文件直接映射到内存中的多个页上面,用户对文件的操作,直接转化为对内存的操作。

 

传统方式的数据访问:


 

需要经历2个阶段,首先从磁盘将数据读到缓存,之后再从缓存将数据copy到进程的用户态内存。

 

mmap的数据访问:


 

mmap实际上会让进程直接访问cache,因为mmap函数,会将缓存映射到进程的地址空间,然后进程即可直接访问。

 

2.4 Zero-Copy

 

Zero-Copy是一种提升Web文件读取速度的技术。首先看一下传统的Web Server文件发送方式:

 



 

其中数据会经历4次Copy,4次上下文切换。其中2次Copy都需要CPU参与。

 

而Zero-Copy技术则是:

 



 

 只需要3次Copy,和2次上下文切换就能完成数据发送,CPU只需要参与一次Copy。

 

优化:

 

 其实还有一种进一步优化方案是合并Read buffer和socket buffer

 

2.5 压缩

 

现实中,Kafka性能的瓶颈在于带宽,经过测试发现,在不断读取消息的过程中,经常会出现网卡被打满的情况。因此压缩技术对Kafka的性能非常重要。Kafka采用了端到端的压缩方式。

 

客户端的消息可以一起被压缩后送到服务端,并以压缩后的格式写入日志文件,以压缩的格式发送到consumer,消息从producer发出到consumer拿到都被是压缩的,只有在consumer使用的时候才被解压缩,所以叫做“端到端的压缩”。

 

支持GZip和Snappy协议

  • 大小: 54.5 KB
  • 大小: 34.6 KB
  • 大小: 24.7 KB
  • 大小: 6.9 KB
  • 大小: 5.9 KB
  • 大小: 75.1 KB
分享到:
评论

相关推荐

    kafka及其性能测试

    性能测试脚本可以用于对Kafka集群的写入性能进行压测,例如使用命令行工具./kafka-producer-perf-test.sh来评估生产者性能。在压测时,通常需要考虑消息大小、批量大小、分区数量、代理数量等因素对测试结果的影响。...

    Kafka分布式消息队列的高性能研究.pdf

    【Kafka概述】 Kafka是一种高吞吐量的分布式消息队列系统,它最初由LinkedIn...在实际使用中,还需要根据业务需求合理设置Topic、Partition和Consumer Group,以及优化网络和硬件配置,以最大化利用Kafka的性能优势。

    5、kafka监控工具Kafka-Eagle介绍及使用

    3. **性能优化**:通过实时展示各种性能指标,Kafka-Eagle 帮助管理员识别潜在的性能瓶颈,进行相应的调整和优化。 4. **报警机制**:当监控指标超过预设阈值时,Kafka-Eagle 可以触发报警,及时通知管理员处理问题...

    kafkatool 连接kafka工具

    为了方便管理和操作 Kafka 集群,开发者通常会使用各种工具,其中 `kafkatool` 是一款广泛使用的命令行工具。本文将深入探讨 `kafkatool` 的功能、使用方法以及如何利用它来连接和管理 Kafka 集群。 **1. kafkatool...

    kafka学习之路

    Kafka使用日志文件来存储消息。每个分区都有自己的日志文件,这些文件按照时间顺序追加新的消息。Kafka通过设置日志文件的保留时间或大小来控制存储空间的使用。 **3. Kafka与ZooKeeper的关系** 虽然Kafka自身具备...

    Kafka使用手册

    Kafka 使用手册 Kafka 是一个高性能、分布式的消息队列系统,广泛应用于大数据处理、实时数据处理和流式数据处理等领域。本文档将详细介绍 Kafka 的安装步骤、基本操作命令和配置文件的修改,以便让初学者快速入门...

    使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据

    3. **Kafka生产者**:将Netty接收到的数据写入Kafka,我们需要创建一个Kafka生产者。使用SpringBoot整合Kafka,可以利用`@KafkaProducer`注解配置生产者属性,如topic、key序列化器和value序列化器。生产者API允许...

    Kafka管理工具Kafka Tool

    5. **性能测试**:内置的生产者和消费者模拟器可以用于测试Kafka集群的性能,包括消息发送速率、延迟等,这对于优化集群配置和评估扩展性具有重要意义。 6. **监控与报警**:Kafka Tool可以设置阈值监控,当达到...

    Kafka vs RocketMQ—— Topic数量对单机性能的影响1

    在本文中,我们将对比分析Apache Kafka与Apache RocketMQ在处理大量Topic时的性能表现。上一期测试主要关注了三款消息中间件(Kafka、RabbitMQ、RocketMQ)在简单消息发送场景下的性能,而本期则模拟了一个更为实际...

    Kafka简介及使用PHP处理Kafka消息

    3. 使用 PHP 生产、消费 Kafka 消息 Kafka 是一种高吞吐的分布式消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区、多副本、冗余,因此被广泛用于大规模...

    Kafka-Vip-高性能消息中间件Kafka实战(1)1

    Kafka 使用 **Consumer Group** 的概念,同一个 Group 中的 Consumers 会协作消费 Topic 中的消息,保证消息的唯一消费。每个 Consumer 在 Commit Log 中维护自己的消费进度,即 Offset。由于 Consumers 自主管理 ...

    kafka 插件kafka 插件kafka 插件

    4. **部署和监控**: 将插件部署到生产环境,并使用监控工具检查Kafka集群的健康状况和性能指标。 ### 常见问题和解决方案 - **消息丢失**: 可能由于消费者未正确提交偏移量或生产者重试策略不当。应调整配置以确保...

    kafka可视化工具--kafkatool

    - 在大型集群上使用时,注意性能监控,避免因频繁查询而对Kafka服务造成压力。 - 对于敏感操作(如删除topic),建议先备份重要数据。 总的来说,Kafkatool是Kafka管理员和开发人员的得力助手,它简化了与Kafka交互...

    log4jappender配置kafka使用的jar包

    3. **特定的Log4j-Kafka适配器**:为了使Log4j能够与Kafka进行通信,还需要一个中间件库,比如`log4j-kafka-appender.jar`或`log4j-appender-kafka-*.jar`,具体取决于你选择的实现。 在实际项目中,你可能需要将...

    kafka使用到的所有jar包

    这个名为"Kafka使用到的所有jar包"的压缩文件包含了运行和开发Kafka应用所需的核心库和依赖。以下是其中可能包含的一些关键jar包及其作用: 1. **kafka_2.13-*.jar**: 这是Kafka的主要客户端库,包含了生产者、消费...

    kafka部署和使用详尽PDF

    《Kafka部署与使用详解》 Kafka是一种分布式流处理平台,广泛应用于大数据实时处理、日志收集、消息系统等领域。这份详尽的PDF文档详细介绍了如何在Linux环境下部署和使用Kafka,包括单机部署和集群部署。 一、...

    Spring Boot集群管理工具KafkaAdminClient使用方法解析

    Spring Boot 集群管理工具 KafkaAdminClient 使用方法解析 KafkaAdminClient 是 Spring Boot 集群管理工具中的一部分,主要用于管理和检视 Kafka 集群中的Topic、Broker、ACL 等对象。下面将详细介绍 Kafka...

    C#kafka开发实例

    在本文中,我们将深入探讨如何使用C#进行Kafka开发,以及如何实现数据同步。Kafka是一种高效的消息中间件,最初由LinkedIn开发,现在已成为Apache软件基金会的顶级项目。它被设计为支持高吞吐量、低延迟的消息传递,...

    Kafka详细课程讲义

    本课程主要涵盖了Apache Kafka的核心概念、安装配置、架构解析、API使用以及监控与面试知识点,旨在帮助学习者全面理解并掌握这一强大的分布式流处理平台。 **第 1 章 Kafka 概述** Apache Kafka是一款高吞吐量的...

    StormStorm集成Kafka 从Kafka中读取数据

    在大数据实时处理领域,Apache Storm与Apache Kafka经常被结合使用,形成高效的数据流处理系统。本文将深入探讨如何实现Storm与Kafka的集成,重点在于如何从Kafka中读取数据。 **一、整合说明** Apache Storm是一...

Global site tag (gtag.js) - Google Analytics