系列导读:本篇将深入讲解 Kafka 生产环境的部署、配置与最佳实践。
文章目录
-
- [一、Kafka 架构概述](#一、Kafka 架构概述)
-
- [1.1 核心概念](#1.1 核心概念)
- [1.2 核心组件](#1.2 核心组件)
- 二、生产环境部署
-
- [2.1 集群规划](#2.1 集群规划)
- [2.2 关键配置](#2.2 关键配置)
- [2.3 Docker Compose 部署](#2.3 Docker Compose 部署)
- 三、生产者最佳实践
-
- [3.1 配置优化](#3.1 配置优化)
- [3.2 发送消息](#3.2 发送消息)
- 四、消费者最佳实践
-
- [4.1 配置优化](#4.1 配置优化)
- [4.2 消费消息](#4.2 消费消息)
- 五、监控与运维
-
- [5.1 关键指标](#5.1 关键指标)
- [5.2 监控工具](#5.2 监控工具)
- 总结
一、Kafka 架构概述
1.1 核心概念
┌─────────────────────────────────────────────────────────────┐
│ Kafka 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Producer ──► Topic ──► Partition ──► Consumer │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Broker │ (集群) │
│ └─────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ ZooKeeper│ │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 核心组件
| 组件 | 说明 |
|---|---|
| Broker | Kafka 服务节点 |
| Topic | 消息主题 |
| Partition | 分区,并行处理单元 |
| Consumer Group | 消费者组,实现负载均衡 |
| ZooKeeper | 集群协调服务 |
二、生产环境部署
2.1 集群规划
生产环境推荐配置:
- Broker: 3+ 节点(奇数)
- ZooKeeper: 3+ 节点
- 磁盘: SSD,独立磁盘
- 内存: 32GB+
- 网络: 万兆网卡
2.2 关键配置
properties
# server.properties
# Broker ID(集群内唯一)
broker.id=0
# 监听地址
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.1.100:9092
# 日志目录(建议多磁盘)
log.dirs=/data/kafka-logs
# 分区数
num.partitions=3
# 副本数
default.replication.factor=3
# 最小同步副本
min.insync.replicas=2
# 日志保留时间
log.retention.hours=168
# 日志段大小
log.segment.bytes=1073741824
2.3 Docker Compose 部署
yaml
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
volumes:
- ./zk-data:/var/lib/zookeeper/data
kafka1:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.100:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
kafka2:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- "9093:9092"
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.101:9093
三、生产者最佳实践
3.1 配置优化
java
@Configuration
public class KafkaProducerConfig {
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> config = new HashMap<>();
// Broker 地址
config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
"192.168.1.100:9092,192.168.1.101:9092");
// 重试次数
config.put(ProducerConfig.RETRIES_CONFIG, 3);
// 批量大小
config.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
// 等待时间
config.put(ProducerConfig.LINGER_MS_CONFIG, 5);
// 缓冲区大小
config.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
// ACK 配置
config.put(ProducerConfig.ACKS_CONFIG, "all");
// 序列化
config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
StringSerializer.class);
config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
StringSerializer.class);
return new DefaultKafkaProducerFactory<>(config);
}
}
3.2 发送消息
java
@Service
public class OrderProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
// 同步发送
public void sendSync(Order order) {
try {
SendResult<String, String> result = kafkaTemplate.send(
"order-topic",
order.getId(),
JSON.toJSONString(order)
).get();
log.info("发送成功: {}", result.getRecordMetadata());
} catch (Exception e) {
log.error("发送失败", e);
}
}
// 异步发送
public void sendAsync(Order order) {
kafkaTemplate.send("order-topic", order.getId(), JSON.toJSONString(order))
.addCallback(
result -> log.info("发送成功"),
ex -> log.error("发送失败", ex)
);
}
}
四、消费者最佳实践
4.1 配置优化
java
@Configuration
@EnableKafka
public class KafkaConsumerConfig {
@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map<String, Object> config = new HashMap<>();
config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
"192.168.1.100:9092,192.168.1.101:9092");
config.put(ConsumerConfig.GROUP_ID_CONFIG, "order-group");
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
config.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 100);
config.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 300000);
config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(config);
}
}
4.2 消费消息
java
@Component
public class OrderConsumer {
@KafkaListener(
topics = "order-topic",
groupId = "order-group",
concurrency = "3"
)
public void consume(ConsumerRecord<String, String> record,
Acknowledgment ack) {
try {
Order order = JSON.parseObject(record.value(), Order.class);
// 业务处理
processOrder(order);
// 手动提交偏移量
ack.acknowledge();
} catch (Exception e) {
log.error("消费失败: {}", record.value(), e);
// 发送到死信队列
sendToDLQ(record);
}
}
}
五、监控与运维
5.1 关键指标
| 指标 | 说明 | 告警阈值 |
|---|---|---|
| MessagesInPerSec | 每秒消息数 | - |
| BytesInPerSec | 每秒字节数 | - |
| UnderReplicatedPartitions | 未同步分区数 | > 0 |
| OfflinePartitionsCount | 离线分区数 | > 0 |
| ActiveControllerCount | 活跃控制器数 | = 1 |
5.2 监控工具
推荐监控方案:
- Prometheus + Grafana:指标监控
- Kafka Manager:可视化管理
- Kafka Exporter:指标导出
总结
✅ Kafka 架构 :Broker、Topic、Partition
✅ 生产环境部署 :集群规划、配置优化
✅ 生产者实践 :配置、同步/异步发送
✅ 消费者实践 :配置、手动提交
✅ 监控运维:关键指标、监控工具
下篇预告 :RabbitMQ 高可用集群部署
作者 :刘~浪地球
系列 :消息队列(一)
更新时间:2026-04-12