消息队列--Kafka 生产环境最佳实践

系列导读:本篇将深入讲解 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

相关推荐
却话巴山夜雨时i5 小时前
互联网大厂Java面试场景:Spring Boot、微服务与Redis实战解析
spring boot·redis·微服务·kafka·prometheus·java面试·电商场景
juniperhan5 小时前
Flink 系列第8篇:Flink Checkpoint 全解析(原理+流程+配置+优化)
大数据·分布式·flink
lvyuanj5 小时前
zookeeper_cluster
分布式·zookeeper·云原生
indexsunny5 小时前
互联网大厂Java面试实战:Spring Boot、MyBatis与Kafka在电商场景中的应用
java·spring boot·面试·kafka·mybatis·电商·技术栈
嵌入式老牛6 小时前
SST专题3-1 基于光分路器的MMC分布式控制系统架构(二)
分布式·电力电子·mmc·固态变压器
刘~浪地球6 小时前
消息队列--RabbitMQ 高可用集群部署
分布式·rabbitmq·ruby
武子康7 小时前
大数据-266 实时数仓-Canal + Kafka 实现 MySQL 数据库变更实时捕获
大数据·后端·kafka
creator_Li7 小时前
Kafka 全面技术笔记
笔记·学习·kafka
Albert Edison8 小时前
【RabbitMQ】快速入门
java·分布式·rabbitmq