生产者

生产者是 Kafka 消息的入口,理解生产者的工作原理是保证消息可靠投递的基础。

生产者架构

发送流程

┌─────────────────────────────────────────────────────────────┐
│                      Kafka Producer                          │
│                                                              │
│  ┌──────────┐    ┌────────────┐    ┌─────────────────────┐  │
│  │ 业务线程  │───▶│ Serializer │───▶│    Partitioner     │  │
│  │ send()   │    │  序列化器   │    │     分区器          │  │
│  └──────────┘    └────────────┘    └──────────┬──────────┘  │
│                                               │              │
│                                               ▼              │
│                              ┌────────────────────────────┐  │
│                              │      RecordAccumulator     │  │
│                              │   ┌─────┐ ┌─────┐ ┌─────┐ │  │
│                              │   │Batch│ │Batch│ │Batch│ │  │
│                              │   │ P0  │ │ P1  │ │ P2  │ │  │
│                              │   └─────┘ └─────┘ └─────┘ │  │
│                              └───────────────┬────────────┘  │
│                                              │               │
│  ┌────────────┐                              │               │
│  │  Sender    │◀─────────────────────────────┘               │
│  │  Thread    │                                              │
│  └─────┬──────┘                                              │
│        │                                                     │
└────────┼─────────────────────────────────────────────────────┘


    Kafka Broker

核心组件

组件
作用

Serializer

将消息 Key/Value 序列化为字节数组

Partitioner

决定消息发送到哪个 Partition

RecordAccumulator

消息累加器,批量发送

Sender

发送线程,负责网络 I/O

NetworkClient

网络客户端,管理连接

发送方式

三种发送方式

发送方式对比

方式
特点
适用场景

发送并忘记

不关心结果,可能丢消息

日志等可容忍丢失场景

同步发送

阻塞等待结果,性能差

对可靠性要求极高

异步发送

非阻塞,高性能

大多数场景

分区策略

默认分区策略

分区策略详解

自定义分区器

批量发送与压缩

批量发送

批量参数配置

压缩配置

压缩算法对比:

算法
压缩率
CPU 消耗
适用场景

none

CPU 敏感

gzip

最高

网络带宽受限

snappy

中等

通用

lz4

中等

最低

推荐

zstd

中等

Kafka 2.1+

关键配置参数

可靠性相关

性能相关

幂等性与事务

幂等性 Producer

幂等性原理:

事务 Producer

事务使用场景:

完整代码示例

面试高频问题

1. 如何保证消息不丢失?

2. 如何保证消息有序?

3. batch.size 和 linger.ms 的关系?

4. 幂等性如何实现的?

总结

Last updated