详细讲解RocketMQ!包含多个知识点!通俗易懂!(顺序、延时消息、死信队列、消费幂、消息过滤)

RocketMQ提供了全局和部分顺序消息,保证消息严格按顺序发布和消费。延时消息可用于超时场景,如未支付订单处理。死信队列处理无法正常消费的消息,而消费幂等则防止重复消费导致异常。RocketMQ还支持服务端的消息过滤,包括Tag和SQL92表达式过滤。

一、顺序消息

顺序消息(FIFO 消息)是消息队列 RocketMQ 提供的一种严格按照顺序来发布和消费的消息。顺序发布和顺序消费是指对于指定的一个 Topic,生 产者按照一定的先后顺序发布消息;消费者按照既定的先后顺序订阅消息,即先发布的消息一定会先被客户端接收到。

顺序消息分为全局顺序消息和分区顺序消息。

1.1、全局顺序消息

RocketMQ 在默认情况下不保证顺序,要保证全局顺序,需要把 Topic 的读写队列数设置为 1,然后生产者和消费者的并发设置也是 1。所以这样的话 高并发,高吞吐量的功能完全用不上。
在这里插入图片描述

1.1.1、适用场景

适用于性能要求不高,所有的消息严格按照 FIFO 原则来发布和消费的场景。

1.1.2、示例

要确保全局顺序消息,需要先把 Topic 的读写队列数设置为 1,然后生产者和消费者的并发设置也是 1。
mqadmin update Topic -t AllOrder -c DefaultCluster -r 1 -w 1 -n 127.0.0.1:9876
在证券处理中,以人民币兑换美元为 Topic,在价格相同的情况下,先出价者优先处理,则可以按照 FIFO 的方式发布和消费全局顺序消息。

1.2、部分顺序消息

对于指定的一个 Topic,所有消息根据 Sharding Key 进行区块分区。同一个分区内的消息按照严格的 FIFO 顺序进行发布和消费。Sharding Key 是顺 序消息中用来区分不同分区的关键字段,和普通消息的 Key 是完全不同的概念。

二、延时消息

2.1、概念介绍

延时消息:Producer 将消息发送到消息队列 RocketMQ 服务端,但并不期望这条消息立马投递,而是延迟一定时间后才投递到 Consumer 进行消费, 该消息即延时消息。

2.2、适用场景

消息生产和消费有时间窗口要求:比如在电商交易中超时未支付关闭订单的场景,在订单创建时会发送一条延时消息。这条消息将会在 30 分钟以 后投递给消费者,消费者收到此消息后需要判断对应的订单是否已完成支付。 如支付未完成,则关闭订单。如已完成支付则忽略。

2.3、使用方式

Apache RocketMQ 目前只支持固定精度的定时消息,因为如果要支持任意的时间精度,在 Broker 层面,必须要做消息排序,如果再涉及到持久化, 那么消息排序要不可避免的产生巨大性能开销。(阿里云 RocketMQ 提供了任意时刻的定时消息功能,Apache 的 RocketMQ 并没有,阿里并没有开源)
发送延时消息时需要设定一个延时时间长度,消息将从当前发送时间点开始延迟固定时间之后才开始投递。
延迟消息是根据延迟队列的 level 来的,延迟队列默认是
** msg.setDelayTimeLevel(5)代表延迟一分钟
** "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"

是这 18 个等级(秒(s)、分(m)、

<think>嗯,用户现在想了解JavaScript Promise的详细知识点,并且希望用通俗易懂的方式讲解,还要整理成容易背诵的文本格式。之前用户已经询问过JavaScript的异步操作,我之前给出过包含Promise在内的总结,但用户现在希望更深入、更详细讲解Promise本身。 首先,我需要回顾之前的对话,确保内容不重复,同时补充更多细节。用户提到参考了站内引用,但那个引用是关于AngularJS的ng-click指令的,可能不太相关,所以应该忽略,专注于用户当前的需求。 用户可能需要Promise的核心概念、用法、方法链、错误处理、静态方法等。另外,用户想要易于背诵的格式,可能需要分点、列表、对比表格、代码示例和记忆口诀。 需要确保内容结构清晰,分章节,每个部分有明确的标题,比如基础概念、核心方法、执行顺序等。使用比喻帮助理解,例如快递站模型,这样更容易记忆。 还要注意用户可能的应用场景,比如如何处理多个Promise,错误捕获,以及常见的面试问题,比如执行顺序。同时,用户可能需要实际代码示例,比如如何封装AJAX请求,或者并发控制。 需要检查是否有遗漏的重要知识点,比如Promise的状态不可逆、微任务队列、与async/await的关系等。同时,注意引用之前的回答中的内容,保持一致性,比如事件循环的执行顺序。 最后,总结成口诀或要点,方便用户背诵。确保语言简洁,避免技术术语过多,用日常例子帮助理解。</think>### JavaScript Promise 知识点大全(背诵专用版) --- #### 一、核心概念(3W记忆法) **What** 异步操作管理器,包含三种状态: `pending`(等待)→ `fulfilled`(成功) / `rejected`(失败) **Why** 解决回调地狱问题(Callback Hell),提供链式操作能力 **How** ```javascript const promise = new Promise((resolve, reject) => { if (成功条件) resolve(结果) else reject(错误) }) ``` --- #### 二、核心方法链(黄金三角) | 方法 | 作用 | 状态触发条件 | |------------|----------------------|------------------| | `.then()` | 接收成功结果 | 前序Promise成功 | | `.catch()` | 捕获失败结果 | 任意环节发生错误 | | `.finally()`| 最终执行(无论成败) | 总是最后执行 | **基础链式结构**: ```javascript fetchData() .then(处理成功) .catch(处理失败) .finally(清理操作) ``` --- #### 三、状态流转图(必背) ``` pending → [[ resolve(value) ]] → fulfilled → 触发.then() [[ reject(error) ]] → rejected → 触发.catch() ``` **重要特性**: 1. 状态不可逆(单向流动) 2. 值穿透特性(空.then()传递结果) 3. 微任务队列执行(优先于setTimeout)[^1] --- #### 四、静态方法(四大金刚) 1. **`Promise.resolve()`** 快速创建成功Promise ```javascript Promise.resolve(42) 等价于 new Promise(resolve => resolve(42)) ``` 2. **`Promise.reject()`** 快速创建失败Promise ```javascript Promise.reject('error') 等价于 new Promise((_, reject) => reject('error')) ``` 3. **`Promise.all([p1,p2])`** 所有Promise成功才算成功 ```javascript // 典型场景:并行加载多个资源 Promise.all([loadImg(), loadData()]).then(([img, data]) => {...}) ``` 4. **`Promise.race([p1,p2])`** 取首个完成的Promise结果 ```javascript // 典型场景:请求超时控制 Promise.race([fetchData(), timeout(5000)]) ``` --- #### 五、错误处理机制(双通道策略) 1. **显式捕获** ```javascript .then(null, errorHandler) // 仅捕获前序错误 ``` 2. **全局捕获** ```javascript .catch(errorHandler) // 捕获链式调用中所有错误 ``` 3. **穿透规则** ```javascript new Promise(() => { throw 'error' }) .then() // 空then不会阻断错误传递 .catch(console.log) // 仍能捕获到错误 ``` --- #### 六、执行顺序经典题(附解析) ```javascript console.log('A') new Promise(res => { console.log('B') res() }).then(() => { console.log('C') setTimeout(() => console.log('D'), 0) }) setTimeout(() => console.log('E'), 0) console.log('F') // 执行顺序:A → B → F → C → E → D // 解析步骤: // 1. 同步代码顺序执行(A/B/F) // 2. 微任务队列清空(C) // 3. 执行宏任务队列(先进入的E先执行) ``` --- ### 记忆口诀(升级版) **基础认知**: "Promise 状态三件套,pending 之后不可倒" **链式调用**: "then接成功catch错,finally最后必过" **静态方法**: "all要全成功race竞速,resolve/reject快速路" **错误处理**: "错误穿透像接力,catch兜底最给力" **执行顺序**: "同步微宏三阶段,then快于setTimeout" --- ### 高频面试要点 1. **手写Promise实现**(核心逻辑背诵) ```javascript class MyPromise { constructor(executor) { this.state = 'pending' this.value = undefined const resolve = (value) => { if (this.state === 'pending') { this.state = 'fulfilled' this.value = value } } executor(resolve, reject) } // 继续补充then方法... } ``` 2. **async/await本质** ```javascript async function foo() {} ≡ function foo() { return new Promise(...) } await p ≡ p.then(...) 的语法糖 ``` [^1]: 微任务队列机制详见ECMAScript规范 [^2]: Promise状态机模型参考Promises/A+标准
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值