黑马点评-消息队列相关
Q:好的我现在明白不是返回数据格式的问题,但我还是很模糊,你给我再讲一下后端返回给前端数据的一般过程,和用消息队列后的返回过程
A:tomcat线程先释放 (本来controller调service service调mapper查询数据库,一整套流程走完返回VO实体类给前端,有了消息队列后,controller接收到请求,查redis,判断下单成功直接给前端返回数据,然后释放tmocat线程,后台启动一个静默线程执行订单insert数据库等操作,,,并在 一段时间后再次给前端返回数据)
我给你画最清晰、最朴素、最真实的前后端交互流程
你马上彻底不模糊!我只讲最本质的区别:
先记住一句超级本质的话
后端给前端返回结果 = 一句话:我做完了没?做完了就给你结果。
消息队列 = 我没做完,但我先告诉你 “我收到了,会慢慢做”。
一、先讲:后端返回给前端数据的正常、一般过程(90% 的业务)
你平时写接口都是这样:
流程:
- 前端发请求 → 到后端 Tomcat
- Tomcat 线程开始处理
- 执行代码:查数据库修改数据库保存数据
- 所有事情全部做完
- 返回 JSON 给前端
- Tomcat 线程释放
样子:
plaintext
请求来了 → 干活 → 干完 → 返回 → 结束
特点:
- 必须等所有逻辑执行完
- 前端必须一直等着
- 数据库慢 → 整个接口就慢
- 高并发 → 线程耗尽 → 系统卡死
二、再讲:使用消息队列后的返回过程(秒杀优化)
流程:
- 前端发请求 → 到后端 Tomcat
- Tomcat 线程开始处理
- 只做超快的事(Redis 判断)
- 把 “要做的慢任务” 扔进消息队列
- 立刻返回 JSON 给前端:抢购成功!
- Tomcat 线程直接释放!!!
后台(另一个独立线程)慢慢执行:
- 从队列拿任务
- 查数据库
- 扣库存
- 创建订单
样子:
plaintext
请求来了 → 快速判断 → 扔队列 → 返回 → 线程结束 (后台线程:慢慢数据库操作)
特点:
- 不等数据库!
- 接口速度极快
- Tomcat 线程瞬间释放,可以处理更多请求
- 数据库压力极小