深啃项目第四篇-kafka

1.特性:
  • 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。

  • 高吞吐量 :即使是非常普通的硬件Kafka也可以支持每秒数百万 的消息。

  • 支持通过Kafka服务器和消费机集群来分区消息。

  • 支持Hadoop并行数据加载

2.kafka在springboot中application.yml

复制代码
application.yml--基础配置
spring:
  profiles:
    active: @profiles.active@  # 根据打包时的maven profile动态指定

# Kafka公共配置(会被各环境继承和覆盖)
kafka:
  # 监听器类型:batch表示批量监听
  listener:
    type: batch
    # 并发消费者数量(可根据环境调整)
    concurrency: 3
    # 批量监听时,没有消息时的等待时间(ms)
    idle-between-polls: 3000
    
  # 生产者公共配置
  producer:
    # 批量发送大小(字节)
    batch-size: 16384
    # 缓冲区总大小(字节)
    buffer-memory: 33554432
    # 序列化器
    key-serializer: org.apache.kafka.common.serialization.StringSerializer
    value-serializer: org.apache.kafka.common.serialization.StringSerializer
    # 压缩方式(none, gzip, snappy, lz4, zstd)
    compression-type: snappy
    
  # 消费者公共配置
  consumer:
    # 是否自动提交偏移量
    enable-auto-commit: true
    # 自动提交间隔(ms)
    auto-commit-interval: 100
    # 解序列化器
    key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    # 一次poll最大记录数
    max-poll-records: 1000
    # 心跳检测间隔(ms)
    heartbeat-interval: 3000
    # 会话超时时间(ms)
    session-timeout: 10000
    # 请求超时时间(ms)
    request-timeout: 30000

# 业务相关配置
app:
  kafka:
    # 业务主题定义
    topics:
      sysuser-change-log: mq_topic_sysuser_change_log  # 用户修改日志
     
application-dev.yml
# 开发环境配置
kafka:
  # 开发环境Kafka地址(通常使用本地或开发服务器)
  bootstrap-servers: localhost:9092,localhost:9093,localhost:9094
  
  # 生产者配置
  producer:
    # 开发环境重试次数较少
    retries: 0
    # 开发环境确认模式:只需要leader确认
    acks: 1
    # 开发环境不压缩以节省CPU
    compression-type: none
    
  # 消费者配置
  consumer:
    # 开发环境消费者组(按开发人员区分)
    group-id: record-consumer-group-dev
    # 开发环境从头开始消费(便于调试)
    auto-offset-reset: earliest
    # 开发环境可以关闭自动提交,便于手动控制
    enable-auto-commit: false
    # 开发环境单次poll较小数据量
    max-poll-records: 100
    # 开发环境隔离级别(默认)
    isolation-level: read_uncommitted

# 开发环境业务配置
app:
  kafka:
    # 开发环境主题命名空间(避免与测试/生产混用)
    topics:
      sysuser-change-log: dev_mq_topic_sysuser_change_log
    
  # 开发环境特殊配置
  dev-mode:
    enabled: true
    # 是否模拟消息发送(当Kafka不可用时)
    mock-producer: false
    # 是否记录消息日志
    log-messages: true

application-prod.yml 
# 生产环境配置
kafka:
  # 生产环境Kafka集群(多节点保证高可用)
  bootstrap-servers: ${KAFKA_CLUSTER_SERVERS:10.0.1.35:9092,10.0.1.36:9092,10.0.1.37:9092}
  
  # 生产者配置(最高可靠性)
  producer:
    # 生产环境必须有重试机制
    retries: ${KAFKA_PRODUCER_RETRIES:10}
    # 生产环境要求所有副本确认
    acks: all
    # 生产环境使用高效压缩
    compression-type: snappy
    # 开启幂等性(Exactly-Once语义基础)
    enable-idempotence: true
    # 生产环境事务支持
    transaction-id-prefix: ${spring.application.name}-tx-
    # 生产环境更长的超时时间
    request-timeout: 120000
    # 生产环境增加批量等待时间(ms)
    linger-ms: 20
    # 最大请求大小
    max-request-size: 1048576
    
  # 消费者配置(最高可靠性)
  consumer:
    # 生产环境消费者组(按服务区分)
    group-id: ${spring.application.name}-consumer-group
    # 生产环境从最新消息开始(除非需要重播)
    auto-offset-reset: latest
    # 生产环境开启自动提交
    enable-auto-commit: true
    # 生产环境更大批量处理
    max-poll-records: 2000
    # 生产环境严格的事务隔离
    isolation-level: read_committed
    # 生产环境更长的心跳间隔
    heartbeat-interval: 5000
    # 生产环境更长的会话超时
    session-timeout: 15000
    # 最大拉取间隔
    max-poll-interval: 450000
    # 生产环境分区策略(粘性)
    partition-assignment-strategy: org.apache.kafka.clients.consumer.CooperativeStickyAssignor
    
  # 监听器配置
  listener:
    concurrency: ${KAFKA_LISTENER_CONCURRENCY:8}  # 根据CPU核数调整
    ack-mode: batch
    # 生产环境手动提交(更可靠)
    ack-count: 100
    ack-time: 5000
    
  # SSL/TLS配置(生产环境建议启用)
  security:
    protocol: SSL
    ssl:
      trust-store-location: classpath:kafka.client.truststore.jks
      trust-store-password: ${KAFKA_SSL_TRUSTSTORE_PASSWORD}
      key-store-location: classpath:kafka.client.keystore.jks
      key-store-password: ${KAFKA_SSL_KEYSTORE_PASSWORD}

# 生产环境业务配置
app:
  kafka:
    topics:
      sysuser-change-log: ${KAFKA_TOPIC_STAFF_CHANGE_LOG:mq_topic_sysuser_change_log}
      
  # 生产环境监控告警
  monitoring:
    # 开启全链路追踪
    trace-enabled: true
    # 开启指标收集
    metrics-enabled: true
    # 开启健康检查
    health-check-enabled: true
    # 异常告警阈值
    error-threshold-percent: 1.0
    # 延迟告警阈值(ms)
    latency-threshold-ms: 1000

application-test.yml
# 测试环境配置
kafka:
  # 测试环境Kafka集群地址
  bootstrap-servers: 10.0.1.35:9092,10.0.1.36:9092,10.0.1.37:9092
  
  # 生产者配置
  producer:
    # 测试环境增加重试机制
    retries: 3
    # 测试环境需要leader和所有副本确认
    acks: all
    # 测试环境请求超时时间
    request-timeout: 60000
    # 启用幂等性(防止重复)
    enable-idempotence: true
    
  # 消费者配置
  consumer:
    # 测试环境消费者组
    group-id: record-consumer-group-test
    # 测试环境从最早未消费开始
    auto-offset-reset: earliest
    # 测试环境开启自动提交
    enable-auto-commit: true
    # 测试环境批量处理更多消息
    max-poll-records: 1000
    # 测试环境更严格的事务隔离
    isolation-level: read_committed
    # 最大拉取等待时间(ms)
    max-poll-interval: 300000
    
  # 监听器配置
  listener:
    concurrency: 5  # 测试环境增加并发
    ack-mode: batch  # 批量确认

# 测试环境业务配置
app:
  kafka:
    topics:
     sysuser-change-log: test_mq_topic_sysuser_change_log
      
  # 测试监控配置
  monitoring:
    # 是否开启消息追踪
    trace-enabled: true
    # 统计采样率(1.0=全部采样)
    sampling-rate: 0.1

3.Kafka 实现解耦与削峰

  • 异步处理:用户注册后,发送邮件/短信的通知逻辑,可以通过发消息到 Kafka,由另一个服务异步处理,提升接口响应速度。

  • 削峰填谷:秒杀场景下,把大量的下单请求先写入 Kafka,后端服务再以自己的最大处理能力从 Kafka 消费,避免数据库被冲垮。

  • 实战任务:在你的项目里实现一个"用户注册成功发送欢迎邮件"的异步功能。

相关推荐
利刃大大3 小时前
【RabbitMQ】延迟队列 && 事务 && 消息分发
分布式·消息队列·rabbitmq·队列
rchmin4 小时前
分布式事务一致性方案介绍
分布式
RockHopper20255 小时前
通用工业 AMR 的分布式状态控制系统设计原理
分布式·智能制造·具身智能·amr
资深web全栈开发5 小时前
实现幂等性的常用方式
分布式·幂等
想用offer打牌5 小时前
一站式了解全局分布式生成ID方案
分布式·后端·面试·架构·系统架构·开源
yumgpkpm6 小时前
Cloudera CDP/CMP华为鲲鹏版下 Spark应用加速,华为昇腾芯片的实用配置过程
hive·hadoop·elasticsearch·flink·kafka·hbase·cloudera
资生算法程序员_畅想家_剑魔6 小时前
Java常见技术分享-分布式篇-SpringCloud-01-基础组件
java·分布式·spring cloud
C+++Python6 小时前
C++分布式语音识别
c++·分布式·语音识别
lbb 小魔仙6 小时前
【Java】基于 Java 的分布式系统实战:分布式锁 + 事务 + 一致性算法,干货满满
java·分布式·算法