当前位置: 首页 > java >正文

NodeJS全栈开发面试题讲解——P11消息队列(MQ)

✅ 11.1 为什么要用消息队列?在哪些场景下最适合?

✅ 作用:

  • 削峰填谷:缓解高并发压力,异步处理任务(如秒杀下单 → MQ → 异步扣库存)

  • 解耦服务:上下游解耦(如下单服务和短信服务)

  • 异步处理:降低请求延迟(如下单后异步发短信、记录日志)

  • 广播通知:多服务订阅同一事件(如订单支付成功 → 通知物流、用户、财务)

✅ 典型使用场景:

  • 秒杀限流、异步发送邮件/短信

  • 日志收集、用户行为打点

  • 微服务事件驱动架构

  • 延迟任务、定时推送


✅ 11.2 RabbitMQ / Kafka / Redis Stream 的区别与适用场景?

特性RabbitMQKafkaRedis Stream
类型AMQP 协议消息队列分布式日志系统(高吞吐)内存消息队列(轻量级)
吞吐量高(百万级 TPS)
消息顺序支持分区内保证顺序支持
持久化支持磁盘持久化高效持久化内存为主+RDB持久化
消费模式推模式(push)拉模式(pull)拉(XREAD)+消费者组
优势易用、功能全、支持ACK/TTL等高性能、大数据分析、日志采集Node.js 原生整合好、灵活
场景通用业务异步、RPC、订单消息等日志分析、监控链路、大规模消费中小型异步任务队列


✅ 11.3 MQ 如何保证消息不丢?如何实现消息的重试机制?

✅ 防止消息丢失的策略:

  1. 生产端确认机制

    • RabbitMQ 开启 publisher confirm

    • Kafka 开启 acks=all

    • Redis 使用 XADD 并手动确认消费

  2. 持久化机制

    • RabbitMQ:设置 durable queue + persistent message

    • Kafka:磁盘持久化 + 日志压缩

    • Redis Stream:持久化配置 + 手动 ack

  3. 消费端手动 ack

    • 消费成功才 ack,失败不确认可重试

✅ 消息重试机制:

  • RabbitMQ:死信队列(DLX)+ 延迟交换器 + retry 次数记录

  • Kafka:设置 retry/backoff,或使用重试 topic

  • Redis:失败记录进失败队列或重入主队列,配合重试次数标记


✅ 11.4 如何处理消息重复消费问题?幂等性的实现方法?

✅ 产生原因:

  • 消息重试或网络问题,导致同一消息被多次消费

✅ 幂等处理策略:

  1. 唯一标识:每条消息带唯一 msgId,消费记录保存到 Redis / DB

  2. 操作前去重判断:如 INSERT ... ON DUPLICATE KEY UPDATE

  3. 数据库事务或锁机制:防止并发写入重复

  4. 消费端去重队列:维护消费记录(如 Redis Set)


✅ 11.5 如何做异步任务处理?Node.js 中有哪些队列库?

✅ 实现方式:

  • 使用消息队列发送异步任务,由专门的 worker 进程消费

✅ 常用队列库:

库名特点
BullMQ基于 Redis,支持任务调度/重试/延迟/优先级
Bee-Queue简洁快速,适合中小项目
AgendaMongoDB 支持,适用于定时任务
Kue老牌 Redis 队列,但维护较少
Bree基于原生 worker_threads 和 cron

推荐 BullMQ(配合 Redis Stream 实现可靠任务队列)


✅ 11.6 MQ 如何处理消息堆积问题?如何限速?

✅ 消息堆积原因:

  • 消费端消费慢 / 宕机

  • 消息生产过快

  • 任务执行时间长

✅ 解决方式:

  1. 增加消费者并发(水平扩展 Worker)

  2. 限速控制生产端(令牌桶算法、漏桶算法)

  3. 异步分批处理任务(批量消费)

  4. 设置 TTL 和死信队列:避免无效消息堆积

  5. 流量预估 + 指标报警(Prometheus + Grafana)


✅ 11.7 什么是发布/订阅模型?和点对点模型的区别?

模型描述例子
发布/订阅(Pub/Sub)一个生产者 → 多个订阅者都能收到消息Redis Pub/Sub,Kafka Topic
点对点(P2P)每条消息只有一个消费者能收到RabbitMQ work queue 模式

Pub/Sub 更适合广播场景(如发系统通知),点对点适合任务队列场景(如视频转码)


✅ 11.8 如何实现延迟消息、定时消息发送?

✅ 常见实现方式:

工具实现方式
RabbitMQ使用延迟插件 rabbitmq_delayed_message_exchange 或 TTL + 死信队列
Kafka无原生支持,可通过延迟 topic + 轮询实现
RedisZSET + 时间戳排序(如 BullMQ 的延迟任务)
BullMQjob.delay() 支持毫秒级延迟


✅ 11.9 如何监控消息队列的健康状态和消费情况?

✅ RabbitMQ:

  • 管理面板(Web UI)

  • 队列堆积长度、连接数、消费速率

  • 配合 Prometheus + Grafana 面板

✅ Kafka:

  • Kafka Manager、Kafka UI

  • 消费组 lag(滞后)监控

  • 消息发送/消费 TPS

✅ Redis:

  • RedisInsight、命令行查看 stream length

  • BullMQ 提供 UI 面板(bull-board、arena)


✅ 11.10 NestJS 如何使用 RabbitMQ / Kafka?使用过 @EventPattern() 吗?

NestJS 提供微服务模块,支持多种 MQ 协议。

✅ 使用方式(以 RabbitMQ 为例):

// main.ts
const app = await NestFactory.createMicroservice(AppModule, {transport: Transport.RMQ,options: {urls: ['amqp://localhost:5672'],queue: 'tasks_queue',queueOptions: { durable: true },},
});
await app.listen();

✅ 消费消息(使用 @EventPattern):

import { Controller } from '@nestjs/common';
import { EventPattern, Payload, Ctx, RmqContext } from '@nestjs/microservices';@Controller()
export class TaskConsumer {@EventPattern('user.created')handleUserCreated(@Payload() data: any, @Ctx() context: RmqContext) {const channel = context.getChannelRef();const originalMsg = context.getMessage();console.log('Received user event:', data);// ack 消息channel.ack(originalMsg);}
}

@EventPattern() 用于监听 MQ 的某个 routing key 或 topic 事件,适用于异步事件处理。


✅ 总结表格

编号关键知识点核心点
11.1为什么使用 MQ解耦、异步、削峰填谷
11.2MQ 类型对比RabbitMQ / Kafka / Redis Stream 区别
11.3消息不丢 + 重试ACK + 持久化 + 死信队列
11.4消息幂等性msgId 去重、Redis 标记
11.5异步任务库BullMQ / Bee-Queue / Agenda
11.6消息堆积限速扩容 + 限流算法 + TTL
11.7Pub/Sub vs P2P广播 vs 分发
11.8延迟消息TTL + 死信 + ZSET + delay job
11.9队列监控工具Prometheus / RabbitMQ UI / Kafka Manager
11.10NestJS 消费 MQ@EventPattern + Transport 设置

http://www.xdnf.cn/news/10385.html

相关文章:

  • 杨校老师竞赛课之GESP一级C++[2024-12]真题及题解
  • git 学习
  • Leetcode 3567. Minimum Absolute Difference in Sliding Submatrix
  • Spring Boot 全局配置文件优先级
  • 基于springboot的宠物领养系统
  • 本振相参解析(1)2025.6.1
  • 【华为云Astro】从OBS CSV文件获取配置指南
  • 语音数据处理:ueng 与 ong 的统一表示方案
  • Python数据类型详解:从字符串到布尔值,一网打尽
  • Vue-2-前端框架Vue基础入门之二
  • 从单机到集群,再到分布式,再到微服务
  • 【计算机系统结构】习题2
  • 雪花算法:分布式ID生成的优雅解决方案
  • 【2025.06】jupyter notebook 7+ 新手安装、配置、扩展应用(windows篇)
  • 【配置指南】Dify部署超全配置参考手册
  • 类和对象(4)
  • 税法 -2.2- 增值税-允许抵扣的进项税额
  • 零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南
  • X-MACRO使用技巧
  • linux命令 systemctl 和 supervisord 区别及用法解读
  • 【计算机网络】Linux下简单的UDP服务器(超详细)
  • 鸿蒙OSUniApp PWA开发实践:打造跨平台渐进式应用#三方框架 #Uniapp
  • Android第十二次面试-多线程和字符串算法总结
  • Mac电脑上本地安装 redis并配置开启自启完整流程
  • uni-app学习笔记十九--pages.json全局样式globalStyle设置
  • Langchaine4j 流式输出 (6)
  • NodeJS全栈开发面试题讲解——P2Express / Nest 后端开发
  • B站视频下载器 v1.0.4|免登录下载1080P视频
  • Global Security Markets 第5章知识点总结
  • 字节面试手撕题:版本号排序