一、消息队列的价值
在高并发系统中,消息队列是构建高性能系统的关键组件。Kafka因其高吞吐、低延迟、持久化等特性,成为业界首选的消息中间件。
二、Kafka核心概念
1. Producer(生产者)
负责发送消息到Kafka集群
java
KafkaProducer producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("topic", "key", "value"));
producer.close();
2. Consumer(消费者)
从Kafka集群消费消息
java
KafkaConsumer consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("topic"));
while(true) {
ConsumerRecords records = consumer.poll(Duration.ofMillis(100));
for(ConsumerRecord record : records) {
System.out.println(record.value());
}
}
3. Broker(代理)
- Kafka集群由多个Broker组成
- 每个Broker存储Topic的分区副本
- Broker之间可以相互备份
4. Topic(主题)和 Partition(分区)
Topic: orders
├── Partition 0 (Leader: Broker-1)
├── Partition 1 (Leader: Broker-2)
└── Partition 2 (Leader: Broker-3)
三、Kafka架构设计
分区机制
- 并行处理:多个分区可并行处理,提高吞吐
- 负载均衡:消息分布在不同分区
- 顺序保证:单分区有序
副本机制
- Leader副本:处理所有读写请求
- Follower副本:异步复制数据
- ISR列表:同步副本集合
四、集群部署
1. 单机部署
bash
# 启动Zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
# 启动Kafka
bin/kafka-server-start.sh config/server.properties
2. 创建Topic
bash
bin/kafka-topics.sh --create --topic orders \
--bootstrap-server localhost:9092 \
--partitions 3 --replication-factor 1
3. 生产消息
bash
bin/kafka-console-producer.sh --topic orders \
--bootstrap-server localhost:9092
五、实战应用场景
场景1:日志收集
应用服务 → Kafka → Logstash → Elasticsearch → Kibana
场景2:订单处理
用户下单 → Kafka → 库存服务
→ 支付服务
→ 物流服务
→ 通知服务
场景3:实时分析
用户行为 → Kafka → Flink实时计算 → Dashboard
六、常见问题
问题1:消息丢失
原因 :网络故障、Broker宕机
解决:配置 acks=all + 重试机制
问题2:消息重复
原因 :Consumer重启、网络抖动
解决:业务幂等性设计
问题3:消费顺序
原因 :多分区并行消费
解决:使用单分区 或 key路由
七、总结
Kafka是构建实时数据平台的基础设施。理解其架构原理,对系统设计和性能优化至关重要。
思考题:在你的项目中,哪些场景适合使用Kafka?有没有遇到过消息丢失或重复的问题?
个人观点,仅供参考