消息队列选型之Kafka + Spring Boot详细实战

消息队列选型之Kafka + Spring Boot详细实战


一、消息队列选型:Kafka vs RabbitMQ vs RocketMQ

1. 选型关键维度

维度 Kafka RabbitMQ RocketMQ
吞吐量 百万级/秒(日志、大数据场景) 万级/秒(复杂路由场景) 十万级/秒(订单、支付场景)
延迟 毫秒级(非实时最优) 微秒级(实时最佳) 毫秒级
可靠性 高(副本+持久化) 高(ACK机制) 非常高(事务消息+多副本)
功能特性 分区、流处理、Exactly-Once语义 复杂路由、死信队列、优先级队列 事务消息、定时消息
适用场景 日志采集、实时流处理 金融交易、任务分发 电商订单、金融交易

2. 选型结论

  • 选择Kafka:高吞吐、持久化存储、流处理场景(如用户行为日志、实时风控)。
  • 选择RocketMQ:需要事务消息、顺序消息的场景(如订单创建、库存扣减)。
  • 选择RabbitMQ:低延迟、复杂路由场景(如支付回调、任务优先级调度)。

二、Kafka核心概念深度剖析

概念 说明
Topic 消息分类的容器,如order-events表示订单事件主题
Partition Topic的分区,每个分区是一个有序队列,支持水平扩展和高并发读写
Offset 消费者在分区中的消费位置,由消费者自行管理(如offset=100表示已消费到第100条消息)
Broker Kafka集群中的单个节点,负责消息存储和转发
Producer 消息生产者,向Topic发送消息
Consumer 消息消费者,从Topic拉取消息并处理
Replication 副本机制,每个分区有多个副本(如replication-factor=3),保障高可用

三、Kafka常用操作命令

1. Topic管理

# 创建Topic(3副本,6分区)
bin/kafka-topics.sh --create \
  --bootstrap-server kafka1:9092 \
  --topic order-events \
  --partitions 6 \
  --replication-factor 3

# 查看Topic详情
bin/kafka-topics.sh --describe \
  --bootstrap-server kafka1:9092 \
  --topic order-events

# 删除Topic
bin/kafka-topics.sh --delete \
  --bootstrap-server kafka1:9092 \
  --topic order-events

2. 生产者发送消息

# 命令行发送消息
bin/kafka-console-producer.sh \
  --bootstrap-server kafka1:9092 \
  --topic order-events

# 输入内容(按Ctrl+D结束)
> {
   "orderId": "1001", "amount": "299.00"}

3. 消费者管理

# 命令行消费消息(从头开始)
bin/kafka-console-consumer.sh \
  --bootstrap-server kafka1:9092 \
  --topic order-events \
  --from-beginning

# 查看消费组进度
bin/kafka-consumer-groups.sh \
  --bootstrap-server kafka1:9092 \
  --group order-group \
  --describe

四、Spring Boot集成Kafka实战


1、添加Kafka Starter依赖

pom.xml中直接使用Spring Boot官方封装的spring-boot-starter-kafka无需手动管理版本

<dependency>
    <groupId>org.springframework.kafkagroupId>
    <artifactId>spring-boot-starter-kafkaartifactId>
    
dependency>

为什么用Starter?

  • 自动配置KafkaTemplate、ConsumerFactory、ProducerFactory等核心组件
  • 默认集成Jackson序列化/反序列化(无需手动配置)
  • 支持通过application.yml一键覆盖参数

2、配置Kafka连接(完整参数模板)

application.yml中配置生产者和消费者的所有关键参数,覆盖默认值:

spring:
  kafka:
    # 集群地址(逗号分隔)
    bootstrap-servers: kafka1:9092,kafka2:9092,kafka3:9092
    
    # 生产者配置(完整参数)
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 使用JSON序列化
      acks: all                   # 消息持久化保证(all=所有副本确认)
      retries: 3                  # 发送失败重试次数
      linger.ms: 20               # 批量发送延迟(单位:毫秒)
      batch-size: 16384           # 批量发送大小(16KB)
      buffer-memory: 33554432     # 生产者缓冲区(32MB)
      compression-type: snappy    # 压缩算法(可选gzip、lz4)
      properties:
        max.block.ms: 60000       # 生产者阻塞超时时间(防止积压)

    # 消费者配置(完整参数)
    consumer:
      group-id: order-group       # 消费者组名称
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer # JSON反序列化
      auto-offset-reset: earliest # 无偏移量时从最早开始消费
      enable-auto-commit: false   # 关闭自动提交(避免重复消费࿰

你可能感兴趣的:(后端开发插件,kafka,spring,boot,消息队列,kafka操作命名,Java)