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.pswp.cn/web/82201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql执行sql语句报错事务锁住

报错情况 1205 - Lock wait timeout exceeded; try restarting transaction先找出长时间运行的事务 SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started ASC;终止长时间运行的事务 KILL [PROCESS_ID];

C#集合循环删除某些行

你想要在遍历集合(例如List)的同时删除某些元素时,直接在循环中删除元素可能会导致问题,因为这可能会改变集合的大小和导致索引问题; 可以用for循环的倒序来删除; 如果要删除满足特定条件的所有元素&…

裂缝仪在线监测装置:工程安全领域的“实时守卫者”

在基础设施运维领域,裂缝扩展是威胁建筑结构安全的核心隐患之一。传统人工巡检方式存在效率低、时效性差、数据主观性强等局限,而裂缝仪在线监测装置通过技术迭代,实现了对结构裂缝的自动化、持续性追踪,为工程安全评估提供科学依…

Multisim14使用教程详尽版--(2025最新版)

一、Multisim14前言 1.1、主流电路仿真软件 1. Multisim:NI开发的SPICE标准仿真工具,支持模拟/数字电路混合仿真,内置丰富的元件库和虚拟仪器(示波器、频谱仪等),适合教学和竞赛设计。官网:艾默生旗下测试和测量系统 - NI。 2. LTspice XVII:ADI旗下免费高性能SPICE仿…

深度学习篇---人脸识别中的face-recognition库和深度学习

深度学习方法和使用 Python 的face_recognition库进行人脸识别在技术原理、实现方式和应用场景上有显著区别,以下从多个维度对比分析: 一、技术原理 1. 深度学习方法 核心逻辑:基于神经网络(如卷积神经网络 CNN)构建…

Go语言中的数据类型转换

Go 语言中只有强制类型转换,没有隐式类型转换。 1. 数值类型之间的相互转换 1.1. 整型和整型之间的转换 package main import "fmt"func main() {var a int8 20var b int16 40fmt.Println(int16(a) b)// 60 }1.2. 浮点型和浮点型之间的转换 packag…

行为型:中介者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的:通过引入一个中介对象来封装一组对象之间的交互,解决对象间过度耦合、频繁交互的问题。不管是对象引用维护还是消息的转发&am…

node_modules\node-sass: Command failed.报错了

node_modules\node-sass: Command failed.错误解决 第一步:删掉:目录中划红线的配置文件 删掉项目中的node_modules第二步:用admin权限执行,重新配置npm和yarn npm config set registry https://registry.npm.taobao.org --global npm con…

STM32 ADC工作原理与配置详解

文章目录 ADCADC简介逐次逼近型ADCADC框图ADC框图的工作流程(以规则组为例)1. 输入通道选择与信号接入2. 触发转换:软件或硬件触发3. 采样保持与量化编码4. 转换结果处理与存储5. 状态标志与中断6. 参考电压与时钟驱动7. 辅助功能&#xff1a…

1、Pytorch介绍与安装

1、Pytorch介绍 PyTorch 是由 Facebook AI Research (FAIR) 团队开发并维护的一款开源深度学习框架,于 2016 年首次发布。它因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究…

RedisTemplate查询不到redis中的数据问题(序列化)

RedisTemplate查询不到redis中的数据问题(序列化) 一.问题描述 存入Redis中的值取出来却为null,问题根本原因就是RedisTemplate和StringRedisTemplate的序列化问题、代码示例: SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTe…

【Net】TCP粘包与半包

文章目录 TCP粘包与半包1 背景2 粘包(packet stick)3 半包(packet split)4 为什么会出现粘包/半包?5 如何解决?6 示例7 总结 TCP粘包与半包 在网络编程中,粘包和半包问题是常见的 TCP 协议特有…

Leetcode 3566. Partition Array into Two Equal Product Subsets

Leetcode 3566. Partition Array into Two Equal Product Subsets 1. 解题思路2. 代码实现 题目链接:3566. Partition Array into Two Equal Product Subsets 1. 解题思路 这一题我的实现还是比较暴力的,首先显而易见的,若要满足题目要求&…

QT中更新或添加组件时出现“”qt操作至少需要一个处于启用状态的有效资料档案库“解决方法”

在MaintenanceTool.exe中点击下一步 第一个: 第二个: 第三个: 以上任意一个放入资料库中

52. N-Queens II

题目描述 52. N-Queens II 回溯法 这道题与第51题是一样的。51. N-Queens-CSDN博客 class Solution {int columns; //从低位到高位起算,第i位为0表示棋盘第i列可以放置皇后,第i位为1表示棋盘第i列不能放置皇后//边长为n的棋盘分别有2n-1条正斜线和反…

解锁AI智能Agent的“风格基因”

从“黑箱”到“智能Agent”:LangChain的架构哲学革新 在LangChain出现之前,开发者直接调用LLM API的方式,充满了“黑箱”操作的挑战: 紧耦合的业务逻辑与模型调用: 所有的业务逻辑、API调用、记忆管理、错误处理等都可能混杂在同一个代码块中。这导致代码脆弱、难以测试,…

大数据运维过程中常见的一些操作

大数据运维是确保大数据系统稳定运行、高效处理数据的关键环节。以下是大数据运维过程中常见的一些操作和任务: 1. 集群部署与配置 基础设施搭建:部署服务器、网络设备、存储系统,配置虚拟化环境(如 Docker、Kubernetes)。分布式系统安装:安装 Hadoop、Spark、Hive、Kaf…

STM32中,如何理解看门狗

在STM32微控制器中,看门狗(Watchdog)是一种硬件计时器,用于监控系统运行状态,防止软件死锁或跑飞。其核心机制是:系统需定期“喂狗”(复位看门狗计数器),若未及时喂狗&am…

[AI算法] LLM中的gradient checkpoint机制

文章目录 什么是gradient checkpoint原理使用场景 注意事项 什么是gradient checkpoint gradient checkpoint是一种优化深度学习模型内存使用的技术,尤其在训练大型模型时非常有用。它通过牺牲计算时间为代价来减少显存占用。大多数情况下,transformers…

船舶二阶非线性响应方程的EKF与UKF参数辨识

船舶二阶非线性响应方程的EKF与UKF参数辨识 本文将详细阐述使用Python实现扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)对船舶二阶非线性响应方程进行参数辨识的过程。全文包含理论推导、算法实现、仿真验证及结果分析。—### 1. 船舶二阶非线性响应方程建模船舶运动可表示为&am…