news 2026/10/14 1:58:25

用 Sarama 的 kafka-producer-performance 工具对 Kafka 生产者进行吞吐与延迟压测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 Sarama 的 kafka-producer-performance 工具对 Kafka 生产者进行吞吐与延迟压测
  • 消息队列
  • 后端

【免费下载链接】sarama

Sarama is a Go library for Apache Kafka.

项目地址:https://gitcode.com/gh_mirrors/sar/sarama
点击查看免费下载

导读

kafka-producer-performance是 Sarama 仓库自带的一款命令行压测工具,用于在真实 Kafka 集群上评估生产者(Producer)的吞吐量、发送延迟与请求并发等关键指标。它同时支持同步(Sync)与异步(Async)两种生产模式,并可通过命令行参数精细控制消息大小、批量刷新策略、压缩算法、ACK 级别与限速,无需安装 JVM 即可完成与 Kafka 官方压测工具类似的验证工作。读完本文,你将掌握该工具的安装方法、全部命令行参数的含义与用法、参数与 Sarama 底层Config的映射关系,以及如何解读压测输出的性能指标。

一、工具定位:不依赖 JVM 的生产者压测工具

Sarama 的 tools 目录 收录了一系列面向 Kafka 集群探索与性能观测的命令行应用,其中kafka-producer-performance专门用于对生产者做性能测试(同步与异步)。与 Kafka 官方自带的部分工具相比,这些工具的最大优势是不需要安装 JVM,直接用 Go 编译出的二进制即可运行。

该工具源码位于 tools/kafka-producer-performance/main.go,使用 Go 标准库flag解析全部命令行参数,并基于 Sarama 的AsyncProducer/SyncProducer完成消息发送,底层指标采集则依赖github.com/rcrowley/go-metrics(见 go.mod)。

二、安装方式

官方 README(tools/kafka-producer-performance/README.md)给出的安装命令为:

go get github.com/IBM/sarama/tools/kafka-producer-performance

也可以按 tools/README.md 的说明一次性安装全部工具:

go install github.com/IBM/sarama/tools/...@latest

安装完成后,命令行中即可直接使用kafka-producer-performance命令。需要注意的是,当前仓库的 go.mod 声明模块为github.com/IBM/sarama,要求 Go 版本1.25.0及以上。

三、快速上手:从最小调用开始

3.1 查看全部命令行选项

kafka-producer-performance -help

该命令会打印工具的全部参数(源码中由flag.PrintDefaults()输出,见 main.go)。

3.2 最小调用示例

README 给出的最小可用命令如下:

kafka-producer-performance \ -brokers=kafka:9092 \ -message-load=50000 \ -message-size=100 \ -topic=producer_test

含义是:向kafka:9092集群中的producer_test主题发送50000 条、每条约100 字节的随机消息,采用默认的异步生产模式。

3.3 必填参数校验

工具启动时会对参数做强制校验(见 main.go),缺少或非法会直接报错退出(退出码 64):

  • -brokers:必填,不能为空;
  • -topic:必填,不能为空;
  • -message-load:必须大于 0;
  • -message-size:必须大于 0;
  • -routines:必须大于 0 且不超过-message-load;
  • -security-protocol:仅支持PLAINTEXT与SSL。

四、全部命令行参数详解

工具共暴露 26 个命令行参数(定义见 main.go),按功能分组如下:

4.1 必填参数

参数默认值说明
-brokers(必填)逗号分隔的 broker 地址列表,如kafka:9092或kafka1:9092,kafka2:9092
-topic(必填)执行压测的目标主题
-message-load(必填)要发送的消息总数
-message-size(必填)每条消息的近似大小(字节)。源码中用crypto/rand生成等长随机字节作为负载(见 main.go)

4.2 连接与安全参数

参数默认值说明
-security-protocolPLAINTEXT与 Kafka 通信的安全协议,支持PLAINTEXT、SSL
-tls-ca-certs空-security-protocol=SSL时用于验证 broker 证书的根 CA 证书文件路径(PEM 格式);留空则使用宿主机的根 CA 集合
-tls-client-cert空需要客户端认证时,发送给 broker 的客户端证书文件路径(PEM 格式);留空表示不启用客户端认证
-tls-client-key空与客户端证书配套的私钥文件路径(PEM 格式);提供了-tls-client-cert则必须提供本参数
-client-idsarama每次请求发送给 broker 的客户端 ID
-version0.8.2.0假设的 Kafka 集群版本,建议设置为实际集群版本以启用对应的协议特性

4.3 消息生产行为参数

参数默认值说明
-partition-1压测目标分区;-1表示不指定分区,交由分区器决定;使用manual分区器时必须指定有效分区
-required-acks1broker 需要的确认数:-1表示全部副本确认(all)、0表示不等待确认(none)、1表示 leader 本地确认(local)
-timeout10s生产者等待-required-acks的最大时长(如10s、500ms)
-partitionerroundrobin分区方案:hash、manual、random、roundrobin
-compressionnone消息压缩方式:none、gzip、snappy、lz4
-max-message-bytes1000000单条消息允许的最大尺寸(字节)
-max-open-requests5单连接上未确认请求的最大并发数,超过则阻塞发送

4.4 批量刷新(Flush)参数

参数默认值说明
-flush-frequency0尽力而为的刷新频率(时长),如100ms
-flush-bytes0触发刷新的尽力而为字节阈值
-flush-messages0触发刷新的尽力而为消息条数阈值
-flush-max-messages0单次请求中最多发送的消息条数(硬上限,0表示不限)

4.5 压测调度与输出参数

参数默认值说明
-syncfalse使用同步生产者(默认是异步生产者)
-routines1并发发送消息的协程数量(仅-sync模式生效)
-throughput0每秒最多发送的消息条数上限(0表示不限速)
-channel-buffer-size256内部与外部通道缓存的事件数量
-verbosefalse开启 Sarama 日志输出到 stderr

五、同步与异步两种压测模式

工具的默认行为是异步生产:所有消息被一次性generateMessages生成后写入producer.Input()通道,同时后台协程从producer.Successes()与producer.Errors()通道逐个消费结果(见 main.go)。这一设计对应 SaramaAsyncProducer的接口契约:Input()写入消息,Successes()/Errors()返回结果,且必须读取结果通道否则生产者会死锁(见 async_producer.go)。

使用-sync切换为同步生产模式后,工具改用sarama.NewSyncProducer,每个协程对每条消息调用producer.SendMessage(message)并同步等待返回(见 main.go)。-routines参数只在同步模式下生效:消息总数会按协程数均分,余数交给最后一个协程。SyncProducer的构造逻辑见 sync_producer.go。

限速逻辑

  • 异步模式(main.go):每发送throughput条消息,等待一个 1 秒周期的 ticker,从而将发送速率限制在约throughput条/秒;
  • 同步模式(main.go):每个协程对每条消息连续发送throughput次后等待 ticker,速率上限同样约为throughput条/秒;
  • -throughput=0时两者均不限速,全速发送。

六、参数如何映射到 Sarama Config:源码级原理

工具在 main.go 中基于全部参数构造sarama.NewConfig(),映射关系如下:

命令行参数Config 字段源码注释要点(见 config.go)
-max-open-requestsNet.MaxOpenRequests单连接在途请求上限,默认 5;关掉幂等时可提升吞吐但不再保证顺序(config.go)
-max-message-bytesProducer.MaxMessageBytes单条/单批消息最大字节数,必须小于MaxRequestSize(config.go)
-required-acksProducer.RequiredAcks等价于 JVM 生产者的request.required.acks(config.go)
-timeoutProducer.Timeout等待确认的最大时长,仅毫秒精度,纳秒部分会被截断(config.go)
-partitionerProducer.Partitioner分区器构造器,见下文(config.go)
-compressionProducer.Compression消息压缩算法
-flush-frequencyProducer.Flush.Frequency尽力而为的刷新频率(config.go)
-flush-bytesProducer.Flush.Bytes尽力而为的字节触发阈值(config.go)
-flush-messagesProducer.Flush.Messages尽力而为的消息条数触发阈值(config.go)
-flush-max-messagesProducer.Flush.MaxMessages单请求消息条数硬上限,默认 0 表示不限(config.go)
-client-idClientID随每个请求发送的客户端标识
-channel-buffer-sizeChannelBufferSize通道缓冲事件数,默认 256(config.go)
-versionVersion假设的 Kafka 版本

其中Producer.Return.Successes被强制设为true(main.go),这是同步生产者正常工作所必需的配置。

分区器与压缩解析

parsePartitioner(main.go)将参数映射到 Sarama 的分区器构造器:

  • manual→NewManualPartitioner:直接使用消息中手动指定的分区(partitioner.go),此时-partition必须 >= 0;
  • hash→NewHashPartitioner:按消息 key 哈希取模分区,保证相同 key 落在同一分区(partitioner.go);
  • random→NewRandomPartitioner:每次随机选分区(partitioner.go);
  • roundrobin→NewRoundRobinPartitioner:依次轮询可用分区(partitioner.go)。

parseCompression(main.go)支持none、gzip、snappy、lz4四种压缩编码,分别对应sarama.CompressionNone/CompressionGZIP/CompressionSnappy/CompressionLZ4。

SSL 分支

当-security-protocol=SSL时(main.go),工具调用 tools/tls/config.go 中的tls.NewConfig构造 TLS 配置——该函数强制MinVersion为 TLS 1.2,并在提供了客户端证书与私钥时加载X509KeyPair;若同时指定了-tls-ca-certs,则从 PEM 文件构建独立的根 CA 证书池替代宿主机默认集合(main.go)。最终通过config.Net.TLS.Enable = true与config.Net.TLS.Config = tlsConfig生效,并在config.Validate()通过后开始压测。

七、输出指标解读

工具每5 秒周期打印一次指标快照(见 main.go),并在生产者关闭前打印最终统计(printMetrics,见 main.go)。输出格式如下:

<count> records sent, <rate> records/sec (<ingress> MiB/sec ingress, <egress> MiB/sec egress), <avg> ms avg latency, <stddev> ms stddev, <p50> ms 50th, <p75> ms 75th, <p95> ms 95th, <p99> ms 99th, <p99.9> ms 99.9th, <inflight> total req. in flight

各指标对应 Sarama 内置的 metrics 注册项(完整说明见 sarama.go):

输出项底层指标类型含义
records sent / records/secrecord-send-ratemeter每秒发送到所有主题的记录数,在 Produce 请求构造时计数(见 produce_request.go)
avg / stddev / 各分位延迟request-latency-in-mshistogram所有 broker 的请求延迟(毫秒)分布,由 broker 层维护(见 broker.go)
MiB/sec egressoutgoing-byte-ratemeter每秒写出的字节数(所有 broker 合计)
total req. in flightrequests-in-flightcounter当前等待响应的在途请求数(见 broker.go)

注意:输出中的MiB/sec ingress并非独立指标,而是由record-send-rate × 消息大小 / 1024 / 1024估算得到(见 main.go),用于近似衡量写入侧数据速率;而 egress 直接来自outgoing-byte-rate。request-latency-in-ms覆盖了 50th、75th、95th、99th、99.9th 五个分位点(main.go),可据此判断延迟分布的尾延迟情况。相关指标在 broker_test.go 与 functional_producer_test.go 中均有测试用例验证。

八、压测实战建议与注意事项

  1. 设置正确的-version:默认值0.8.2.0是比较保守的旧版本,会限制可协商的 API 版本与协议特性。压测前建议按实际集群版本显式设置,例如-version=3.2.0,以启用更完整的协议能力。
  2. 按需调整-required-acks:1(leader 确认)适合追求吞吐;-1(全部副本确认)数据可靠性更高但吞吐下降、延迟上升;0不等待确认,吞吐最高但可能丢消息。-timeout需与 acks 级别配合,避免过短导致发送超时。
  3. 利用压缩与批量刷新验证吞吐差异:在消息较大时,-compression=gzip(或snappy/lz4)可显著降低网络字节量(观察 egress 指标);-flush-messages、-flush-bytes、-flush-frequency组合可控制批量聚合粒度,观察单请求消息数与吞吐的变化。
  4. 主题自动创建:Sarama 默认开启Metadata.AllowAutoTopicCreation = true(见 config.go),-topic指定的主题在 broker 允许时会被自动创建;否则需提前手动建好主题。
  5. 同步模式并发:需要更高发送并发时使用-sync并配合-routines提升协程数;异步模式本身基于通道与后台协程,无需-routines。
  6. 限速场景:做“稳定速率”验证(如模拟真实业务 QPS)时使用-throughput,其实现依赖秒级 ticker,速率控制是尽力而为的粗粒度限速。

结语

kafka-producer-performance以极小的命令行面覆盖了 Sarama 生产者压测的核心场景:从必填参数校验、同步/异步双模式、四类分区器与四种压缩算法,到 Flush 批量策略、TLS 安全连接与基于 go-metrics 的指标输出,均有完整实现可供参考。结合本文对 main.go 与 config.go 的映射分析,你可以直接将该工具用作日常集群压测脚本,也可以把它当作编写自定义 Sarama 压测程序的起点模板。

  • 消息队列
  • 后端

【免费下载链接】sarama

Sarama is a Go library for Apache Kafka.

项目地址:https://gitcode.com/gh_mirrors/sar/sarama
点击查看免费下载

相关推荐

上一篇:Spongy Castle核心组件解析:证书处理、密钥管理与安全随机数生成
下一篇:Lobe TTS API完全指南:从基础调用到高级参数配置

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 1:57:44

Microsoft Edge 无法翻译/翻译失败的一种解决方法:修复 Edge

最近在使用 Microsoft Edge 浏览网页时遇到了一个问题&#xff1a; Edge 自带的网页翻译功能突然无法正常使用&#xff0c;一直提示“无法翻译”或者“翻译失败”。 浏览器本身可以正常使用&#xff0c;网页也能够正常打开&#xff0c;但翻译功能就是无法工作。 在尝试解决之…

作者头像 李华
网站建设 2026/10/14 1:57:18

Ghost误操作恢复全攻略:抢在二次写入前拯救数据

简介&#xff1a;当使用Ghost还原系统时误选目标分区&#xff0c;很可能导致整个硬盘的分区表损坏、数据“凭空消失”&#xff0c;这时掌握正确的恢复方法至关重要。这份图文教程以一位用户的真实误操作案例为切入点&#xff0c;面向遇到类似分区丢失问题的普通电脑用户与维护人…

作者头像 李华
网站建设 2026/10/14 1:55:46

SearXNG 搜索引擎配置优化实录

SearXNG 是自托管的元搜索引擎&#xff0c;聚合多个搜索源的结果。默认配置下启用约 350 个引擎&#xff0c;但大部分在当前网络环境下不可用。本文记录一次从 350 个引擎精简到 19 个的过程。 测试环境&#xff1a;ARMv7l&#xff0c;Debian trixie&#xff0c;SearXNG 4.0.0…

作者头像 李华
网站建设 2026/10/14 1:55:21

AI 入门—— 一起来学Function Call、MCP、Agent

文章大纲引言一、Function Call1、核心价值2、Function Call 时序图3、Function call如何嵌入到模型中&#xff1f;二、什么是MCP?三、MCP Server1、MCP 架构2、MCP的通信机制3、MCP Server的核心功能3.1、动态工具发现3.2、权限控制与安全执行3.3、资源暴露与工具调用3.4、实…

作者头像 李华