Skip to content

Kafka 消息队列

核心概念

概念说明
Topic消息分类,逻辑上的消息队列
PartitionTopic 的物理分片,有序且不可变日志,并行度由分区数决定
Consumer Group消费者组,组内消费者各消费不同分区,实现负载均衡
BrokerKafka 服务节点,一个集群由多个 Broker 组成
Offset消息在分区中的唯一偏移量,消费者通过 Offset 标记消费位置
Topic: user-events (3 partitions)
  Partition 0: [msg0] [msg1] [msg2] ...  → Consumer A
  Partition 1: [msg0] [msg1] [msg2] ...  → Consumer B
  Partition 2: [msg0] [msg1] [msg2] ...  → Consumer C

消息可靠性保证

三层保障:生产端不丢、Broker 不丢、消费端不丢不重。

环节策略说明
生产端acks=all等待所有 ISR 副本确认后才返回成功
Broker副本机制replication.factor=3min.insync.replicas=2
消费端手动提交 Offsetenable.auto.commit=false,处理完成后手动 ack
消费端幂等消费业务层去重(唯一键 / 数据库唯一约束)
python
from kafka import KafkaProducer, KafkaConsumer
import json

# 生产者
producer = KafkaProducer(
    bootstrap_servers=["localhost:9092"],
    acks="all",                          # 等待所有副本确认
    retries=3,                           # 发送失败重试
    value_serializer=lambda v: json.dumps(v).encode(),
)

producer.send("user-events", {"user_id": 1, "action": "click"})
producer.flush()

# 消费者
consumer = KafkaConsumer(
    "user-events",
    bootstrap_servers=["localhost:9092"],
    group_id="analytics-service",
    enable_auto_commit=False,            # 手动提交 Offset
    auto_offset_reset="earliest",
    value_deserializer=lambda m: json.loads(m.decode()),
)

for msg in consumer:
    process(msg.value)                   # 处理消息
    consumer.commit()                    # 处理成功后手动提交

消息积压处理

  1. 紧急扩容:增加 Consumer 实例数量(不超过 Partition 数)
  2. 增加分区:长期方案,提高并行度
  3. 临时消费者:新建 Consumer Group 消费积压数据转储到其他存储
  4. 根因排查:消费端处理慢(慢查询 / 外部服务超时)或生产端突增

Kafka vs RabbitMQ vs RocketMQ

维度KafkaRabbitMQRocketMQ
定位高吞吐日志/事件流通用消息队列金融级消息队列
吞吐量百万级/s万级/s十万级/s
延迟ms 级us 级ms 级
消息可靠性高(副本)高(确认机制)极高(双写)
消息顺序分区内有序队列有序队列有序
适用场景日志采集、流处理业务解耦、RPC交易、订单

基于 VitePress 构建