文章目录前言1. 为什么在秒杀场景中用 Kafka 消息队列异步下单2. Kafka 消息队列的基础概念回顾3. 秒杀中 Kafka 常见高频问题解析Q1. 如何保证 Kafka 消息不丢失Q2. 如何保证秒杀下单的**幂等性**Q3. Kafka 如何保证**顺序消费**Q4. 如果 Kafka 消费者宕机消息会丢吗Q5. fromBeginning: true/false 有什么区别Q6. 如何处理消费积压LagQ7. Kafka 与 RabbitMQ、RocketMQ 区别Q8. 秒杀如何防止**超卖**和**重复下单**4. 还可以进一步问5. 实战代码相关点 小结前言⚡NestJS Kafka 秒杀系统完整实践总结1. 为什么在秒杀场景中用 Kafka 消息队列异步下单目的解释削峰填谷防止高峰期数据库写入爆炸流量先进入 Kafka 排队缓冲异步处理秒杀请求响应快前端体验好不必等待订单完成系统解耦秒杀接口只负责扣库存不负责下单/支付微服务更灵活高可用Kafka 支持分区冗余、副本机制保证即使节点挂了数据也不丢失2. Kafka 消息队列的基础概念回顾Producer生产者发送消息到 TopicConsumer消费者从 Topic 拉取消息Topic消息分类PartitionTopic 的物理分片提高并发Consumer Group一组消费者分担 Topic 消费负载Offset每条消息在 Partition 中的位移标记消费进度3. 秒杀中 Kafka 常见高频问题解析Q1. 如何保证 Kafka 消息不丢失✅ 生产者配置acksall开启retries重试✅ 消费者端手动提交 offset确保消息成功消费后提交防止未消费即确认✅ Broker端多副本replication.factor 3控制器选举稳定controller.quorum.votersQ2. 如何保证秒杀下单的幂等性订单表中orderId为唯一键消费 Kafka 消息时先查询是否已存在使用 Redis 快速幂等检查如 setnxseckill:order:{orderId}Kafka 消费端设计幂等消费逻辑消费失败时可重试Q3. Kafka 如何保证顺序消费Kafka 本身分区内有序但跨分区无序秒杀时可以将同一商品skuId哈希到同一分区保证同一商品的秒杀请求在同一分区内消费从而局部有序Q4. 如果 Kafka 消费者宕机消息会丢吗不会丢。Kafka 通过 offset 机制保存消费进度consumer 重新启动后会从上次提交的 offset 继续拉取消费注意开启合适的retention消息保留期Q5.fromBeginning: true/false有什么区别参数含义true从最早的消息开始消费包括旧消息false只消费新产生的消息默认通常在秒杀系统消费订单消息时用false。Q6. 如何处理消费积压Lag增加消费者实例数提高消费并发优化业务逻辑降低单次消费时间监控lag及时告警Q7. Kafka 与 RabbitMQ、RocketMQ 区别项目KafkaRabbitMQRocketMQ优势高吞吐、大数据场景、分区机制灵活、易用、适合小系统延时消息、事务消息、轻量应用场景秒杀、日志、流式处理普通业务异步化金融领域、分布式事务顺序保证分区内有序可设置顺序消费但吞吐低支持严格顺序秒杀更推荐 Kafka吞吐量高。Q8. 秒杀如何防止超卖和重复下单超卖问题Redis 预扣库存Lua 原子脚本扣减数据库底层库存扣减二次校验最终一致性重复下单问题Redissetnx防重复订单表orderId唯一约束 Kafka 幂等消费处理4. 还可以进一步问如何配置和管理 Kafka 的 groupId/topic➔.env配置 registerAsync动态注入如何监控 Kafka 消费端健康状态➔ 用 Prometheus 采集 lag、consumer status如何处理消费失败➔ try-catch死信队列(DLQ)补偿机制如何保证消息处理高可用➔ 多实例部署、分区均衡、自动负载迁移5. 实战代码相关点消费者模块用Injectable()注册 Nest 服务onModuleInit() 启动消费KafkaProducerService 独立封装 Producer消费端手动 commit offset控制消费确认Topic、GroupId 支持动态环境配置.env 小结✅ 秒杀系统本质是“高速扣库存 异步下单 幂等保护”Kafka 消息队列正好完美契合这套需求。