Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Kafka 最佳实践

1. Topic 设计最佳实践

1.1 分区数(partitions)

分区越多并发越高,但压力也越大。

建议:

  • 普通业务:3–12 分区
  • 高吞吐业务:12–48 分区
  • 批量写入系统(日志/埋点):48–200 分区

注意坑:

❌ 分区不能随便增大,会导致 rebalancing、数据倾斜、消费者重平衡变慢。

1.2 副本数(replication-factor)

建议:

  • 至少 3 副本
  • 不能用 1(消息丢失不可恢复)

1.3 Topic 名称规范

  • {业务}-{模块}-{环境}
  • 示例:pay-order-prod

2. 生产者(Producer)最佳实践

2.1 ACK 配置

生产环境必须:

acks=all

确保数据写入所有 ISR,极大降低丢消息概率。

2.2 重试机制

retries=∞ (新版为 Integer.MAX_VALUE)
delivery.timeout.ms=120000

注意:

不能使用 retries 小于 delivery.timeout.ms,否则会产生消息丢失或重复发送

2.3 批量发送调优

batch.size=32KB ~ 128KB
linger.ms=5~20ms
compression.type=zstd 或 snappy

目的让 Kafka 合并批量发送,提高吞吐。

2.4 幂等性开启

enable.idempotence=true

保证不重复写消息(避免反复写入造成重复)。

2.5 Producer 内存缓冲

buffer.memory=512MB–2GB

防止写入速度快于网络带宽导致阻塞。

3. 消费者(Consumer)最佳实践

3.1 消费 offset 管理

必须使用 Kafka 的:

enable.auto.commit=false

并手动提交:

commitSync / commitAsync

确保:

  • 先处理消息 -> 再提交 offset
  • 避免消息丢失 / 多次处理

3.2 消费组协调(rebalance)优化

建议:

session.timeout.ms=10s
heartbeat.interval.ms=3s
max.poll.interval.ms=5m

避免:

  • 处理过慢导致 rebalance
  • 频繁 rebalancing 导致吞吐下降

3.3 消费者并发

方式:

  • 增加 Consumer 数量
  • 增加分区数
  • 每个分区对应一个线程(最佳)

4. Broker / 集群最佳实践

⭐ 4.1 JVM 调优

Kafka 内存:

-Xms8G -Xmx8G

避免垃圾回收影响性能:

  • G1GC 是 Kafka 官方推荐
  • 堆尽量小(8–20GB)
  • 页缓存交给 OS

⭐ 4.2 文件系统优化

  • noatime
  • XFS(推荐)
  • ext4 + journaling disabled

Kafka 依赖零拷贝(sendfile),文件系统性能非常重要。

⭐ 4.3 Socket 调优

socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600

⭐ 4.4 分区副本均衡

开启自动均衡:

auto.leader.rebalance.enable=true

避免 leader 全在一个节点导致热点。

⭐ 4.5 数据留存(log.retention)配置

建议:

log.retention.hours=48~168
log.segment.bytes=1GB
log.retention.check.interval.ms=5min

避免 log 文件太多导致磁盘 IO 变差。

5. 可靠性最佳实践(不丢数据)

⭐ 必须配置如下(避免任何丢消息):

Producer 端

acks=all
enable.idempotence=true
retries=
min.insync.replicas=2

Broker 端

min.insync.replicas=2

保证至少 2 个副本写成功。

❗ 禁止使用(会导致丢数据)

  • acks=1
  • 副本数 = 1
  • Kafka 超过磁盘空间后自动删除数据
  • auto.commit=true

6. Kafka 监控与告警最佳实践

6.1 指标(重点监控)

🔥 消息消费延迟(Lag)

必须监控:

  • topic lag
  • group lag
  • consumer 延迟趋势

Lag 过大会造成:

  • 消息堆积
  • OOM
  • rebalance

🔥 Broker 重要指标

  • Under-replicated partitions(URP)
  • Offline partitions
  • Request handler idle %
  • Network IO
  • Page cache 命中率
  • GC 次数与停顿

URP 一旦 >0 需立刻报警。

🔥 磁盘使用率

90% 以上必须报警(Kafka 依赖顺序写)。

推荐监控工具

  • Prometheus + Grafana(最优)
  • Kafka Exporter
  • Confluent Control Center
  • Burrow(Consumer 监控)

7. 安全与权限最佳实践

7.1 开启 SSL(如果跨 IDC / 公网)

SSL + SASL_PLAIN
SASL SCRAM-SHA-256/SHA-512

7.2 ACL 控制权限

用户级别授权:

User:app01 -> TopicA Read
User:app01 -> TopicA Write

避免误写/误删。

8. 数据压缩与吞吐优化

8.1 压缩方式

推荐:

  • zstd(最高压缩率+快)
  • snappy(性能最均衡)
  • lz4(高吞吐业务)

8.2 批量拉取

消费者:

fetch.min.bytes=1MB
fetch.max.wait.ms=50ms
max.partition.fetch.bytes=10MB

Producer:

batch.size=128KB
linger.ms=10ms

9. 常见故障与排查最佳实践

🔥 9.1 消费堆积(Lag 高)

排查步骤:

  1. 消费者数量够不够?
  2. 分区数够不够?
  3. 是否 rebalance?
  4. 单条消息处理是否过慢?
  5. 是否 consumer crash?

🔥 9.2 出现 Under-replicated partitions

原因:

  • 磁盘满
  • 节点宕机
  • 网络抖动
  • GC 时间过长

🔥 9.3 分区热点(部分分区 QPS 高)

原因:

  • 分区 key 设计不合理

解决:

  • 随机分区
  • key 分布均匀
  • 增加分区数

🔥 9.4 生产端报错:“TimeoutException”

原因:

  • broker 太慢
  • acks=all + min.insync.replicas=2,但是同步副本不够
  • 网络质量差

🔥 9.5 消费端报错:“CommitFailedException”

原因:

  • Rebalance 时提交 offset

解决:

  • 放在 poll 之外提交
  • 使用协同任务(Cooperative Sticky Assignor)