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
繁體地址,請注明出處:http://hk.pswp.cn/web/82201.shtml
英文地址,請注明出處:http://en.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…