feat: add interactive demos for AI history, Auth design, and Git intro

This commit is contained in:
sanbuphy
2026-01-19 11:25:10 +08:00
parent bb28f010e3
commit 7d86ba9504
55 changed files with 12984 additions and 5776 deletions
+231 -12
View File
@@ -6,26 +6,245 @@
## 0. 引言:系统的"缓冲器"
你在淘宝买完东西,为什么点击"支付"后,不会立刻收到短信通知?
你在抖音发了一条评论,为什么点赞数不是瞬间就增加?
### 0.1 从生活中的例子说起
这背后都有一个功臣:**消息队列 (Message Queue)**。
想象一下这个场景:
如果同步调用是"打电话",那消息队列就是"发微信"。
打电话要求对方**立即响应**(同步),发微信可以等对方**稍后处理**(异步)。
**🏪 餐厅点餐的智慧**
### 0.1 为什么要用消息队列?
你走进一家繁忙的餐厅,前台服务员(A)迅速给你点单、收钱,然后告诉你"请稍等,餐好了会叫号"。你不需要站在厨房门口等着厨师(B)直接把菜端给你,而是可以安心坐下刷手机。
只有一个理由:**解耦和削峰**
**为什么这么做?**
- 如果每个顾客都站在厨房门口等(同步调用),厨房会乱成一团
- 用"叫号系统"(消息队列),服务员快速完成点餐,厨房按自己的节奏做菜
- 即使厨师临时休息了,点餐也不会受影响,订单会排队等他回来
- **解耦**:A 不需要直接调用 B,把消息扔给队列就完事了。
- _例子_:用户下单后,订单服务不需要直接调用库存、积分、通知服务,而是发一条"下单成功"消息。
- **削峰**:把瞬间的高峰流量"摊平",避免系统被打爆
- _例子_:秒杀活动,1 秒内有 10 万个请求,但数据库只能处理 1000 个。队列把这 10 万个请求暂存起来,慢慢处理。
**🛒 淘宝支付的秘密**
你在淘宝买完东西,点击"支付"后,系统显示"支付成功",但你可能要等几秒甚至几分钟才收到短信通知
**为什么不是立即收到?**
因为支付系统要做的事情太多了:
- ✅ 扣款(必须立即完成)
- ⏳ 发送短信通知(可以稍后)
- ⏳ 更新积分(可以稍后)
- ⏳ 给推荐系统发送数据(可以稍后)
如果把所有事情都卡在"支付"这个按钮上,你可能要等 5 秒才能看到"支付成功"。聪明的系统会:
1. 先完成扣款
2. 把其他任务扔进一个"待办事项池"(消息队列)
3. 立即告诉你"支付成功"
4. 后台慢慢处理那些待办事项
**这就是消息队列的核心价值:把"必须现在做"和"可以稍后做"的事情分开。**
### 0.2 什么是消息队列?
**消息队列**就像一个智能的"中转站"或"缓冲区"
```
如果同步调用是"打电话"(要求对方立即响应)
那消息队列就是"发微信"(可以等对方稍后处理)
```
**用一个比喻理解**
> **没有消息队列**:你直接把文件交给同事,他正在开会,你只能干等。
>
> **有消息队列**:你把文件放到他的办公桌(队列),继续做自己的事。他开完会自己来拿。
### 0.3 为什么要用消息队列?
核心原因就两个:**解耦**和**削峰**。
#### 📌 解耦:让系统更灵活
**问题**:A 直接调用 B,一旦 B 出问题,A 也跟着完蛋。
```python
# 紧耦合的例子(不好)
def create_order(user_id, product_id):
order = db.save_order(user_id, product_id)
# 如果通知服务挂了,整个订单创建就失败
notification.send_sms(user_id, "订单创建成功")
notification.send_email(user_id, "订单创建成功")
return order
```
**解决**:用消息队列做"中介",A 只管发消息,不关心 B 是否在线。
```python
# 松耦合的例子(好)
def create_order(user_id, product_id):
order = db.save_order(user_id, product_id)
# 扔到队列里就完事了,不管通知服务是否在线
queue.publish("order.created", {
"user_id": user_id,
"order_id": order.id
})
return order
```
**好处**
- ✅ 订单系统不依赖通知系统
- ✅ 可以随时增加新的消费者(比如加一个"积分系统")
- ✅ 通知系统升级不影响订单系统
#### 📌 削峰:把洪峰变成平缓的水流
**问题**:瞬间流量太高,系统扛不住。
**场景**:双11秒杀
- 1 秒内有 10 万个请求涌进来
- 数据库每秒只能处理 1000 个
- 如果直接打到数据库,数据库会直接"爆掉"
**解决**:用消息队列当"蓄水池"
```
洪水来了(10 万请求/秒)
[大坝] 消息队列暂存
平缓流出(1000 请求/秒)
[农田] 数据库慢慢处理
```
<PeakShavingDemo />
**关键点**:消息队列的本质是**异步通信**,通过把"立即执行"变成"稍后处理",提升系统的吞吐量和可用性。
### 0.4 消息队列的本质
**一句话总结**:消息队列的本质是**异步通信**,通过把"立即执行"变成"稍后处理",提升系统的吞吐量和可用性。
**关键特点**
-**异步**:不需要等任务完成,立即返回
-**解耦**:服务之间不直接依赖
-**缓冲**:暂存消息,平滑流量
-**可靠**:消息持久化,不怕丢失
---
## 🗺️ 全局观:消息队列知识地图
### 消息队列的核心价值
> **用"空间换时间,用异步换性能"** —— 让系统可以"快速响应请求,慢慢处理任务"
### 知识体系地图
```
消息队列知识体系
├── 📦 基础概念(必学)
│ ├── 生产者(Producer):发送消息的一方
│ ├── 消费者(Consumer):接收并处理消息的一方
│ ├── 消息代理(Broker):存储和转发消息的中介
│ └── 消息模式
│ ├── 点对点(P2P):一条消息被一个消费者消费
│ └── 发布订阅(Pub/Sub):一条消息被多个消费者消费
├── 🎯 核心应用场景(必学)
│ ├── 异步处理:把同步改成异步,提升响应速度
│ ├── 削峰填谷:缓冲高峰流量,保护系统
│ ├── 系统解耦:消除服务之间的直接依赖
│ └── 数据分发:一条消息分发给多个消费者
├── 🔒 可靠性保证(重要)
│ ├── 消息不丢失:持久化 + ACK 机制 + 多副本
│ ├── 消息不重复:幂等性设计
│ └── 消息顺序:单分区或内存排序
├── 🚀 高级特性(进阶)
│ ├── 死信队列(DLQ):处理无法消费的消息
│ ├── 延迟消息:指定时间后才消费
│ └── 事务消息:保证本地事务和消息发送的一致性
├── 🛠️ 主流消息队列(了解)
│ ├── RabbitMQ:传统消息队列,功能丰富
│ ├── Kafka:分布式日志系统,吞吐量极大
│ ├── RocketMQ:电商级消息队列,功能全面
│ └── Redis Stream:轻量级队列,适合小规模应用
└── 📊 实战设计(综合应用)
└── 秒杀系统、订单系统、异步任务处理
```
### 学习路径建议(0 基础小白)
#### 🎒 第一阶段:建立直觉(1-2 小时)
**目标**:理解消息队列是什么,为什么需要它
1. **阅读本章节的 0. 引言部分**
- 理解"餐厅点餐"和"淘宝支付"的例子
- 掌握"解耦"和"削峰"两个核心价值
2. **动手体验**(可选)
- 找一个生活中的"队列"例子(如餐厅叫号、客服排队)
- 画出它的流程图
#### 📚 第二阶段:掌握基础(1-2 天)
**目标**:理解核心概念和基本用法
1. **学习基础概念**
- 生产者、消费者、Broker
- 点对点 vs 发布订阅
- 阅读本章节第 1 部分
2. **选择一个消息队列上手**
- 推荐从 **Redis Stream****RabbitMQ** 开始(学习曲线低)
- 跟着官方文档写一个"生产者-消费者"的 Hello World
3. **实现第一个异步任务**
- 场景:用户注册后,异步发送欢迎邮件
- 用代码实现:注册接口 → 发消息到队列 → 消费者发送邮件
#### 🔥 第三阶段:深入核心(1 周)
**目标**:掌握消息队列的核心用法
1. **学习核心设计模式**
- 异步处理:提升响应速度
- 削峰填谷:保护系统
- 系统解耦:降低依赖
- 阅读本章节第 3 部分
2. **保证可靠性**
- 消息不丢失:持久化 + ACK
- 消息不重复:幂等性设计
- 阅读本章节第 4 部分
3. **实战练习**
- 设计一个"秒杀系统":用消息队列削峰
- 设计一个"订单系统":用消息队列解耦
#### 🚀 第四阶段:精通高级特性(2-4 周)
**目标**:处理复杂场景
1. **高级特性**
- 死信队列:处理异常消息
- 延迟消息:定时任务
- 事务消息:保证一致性
- 阅读本章节第 5 部分
2. **完整系统设计**
- 设计一个带监控的异步处理系统
- 处理各种异常场景(消息丢失、重复、顺序错乱)
3. **深入学习特定 MQ**
- Kafka:学习高可用架构(多副本、分区)
- RocketMQ:学习事务消息
### 学习建议
-**先理解,再动手**:不要一开始就陷入代码细节,先理解为什么需要消息队列
-**从简单开始**:不要一上来就学 Kafka,从 Redis Stream 或 RabbitMQ 开始
-**边学边练**:每学一个概念,就写代码实践一下
-**关注应用场景**:不仅要知其然,还要知其所以然
-**阅读真实案例**:看看淘宝、抖音等大厂如何使用消息队列
---