主题
面试速答(先看这里)
**一句话结论:**避免数据库因为突发流量导致压力过大,其实就是在做削峰填谷,削峰填谷确实是消息队列的一个重要作用。
60秒标准回答:
避免数据库因为突发流量导致压力过大,其实就是在做削峰填谷,削峰填谷确实是消息队列的一个重要作用。除了削峰填谷以外,还有一些办法那就是尽量把流量在前面拦截住,不让他请求到数据库,也是比较常见的手段
但是这个问题,回答的时候,我们还需要能知道这些方案的缺点和局限性
除了直接用消息队列比如RocketMQ,Kafka之之外,还有一些其他中间件也能实现类似的消息队列的功能,比如借助Redis也能轻松实现,Redis的ZSET可以用来实现延迟消息,也可以基于Key的过期消息实现延迟消息,还可以借助Redisson的RDelayQueue来实现延迟消息,都是可以的。比如
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**但是这个问题,回答的时候,我们还需要能知道这些方案的缺点和局限性。
- **要点2:**除了直接用消息队列比如RocketMQ,Kafka之之外,还有一些其他中间件也能实现类似的消息队列的功能,比如借助Redis也能轻松实现,Redis的ZSET可以用来实现延迟消息,也可以基于Key的过期消息实现延迟消息,还可以借助Redisson的RDelayQueue来实现延迟消息,都是可以的。
- **要点3:**但是这么做,是对业务有损的,因为被拦截的流量是直接拒绝了,而不像MQ,其实是把请求放在自己的消息队列中做了缓冲,这个差别需要注意。
- **要点4:**题目是如何避免因为突发流量导致压力过大,还有个思路那就是我不想办法减少流量,而是想办法减少压力。
- **要点5:**我说了这么多方案,是不是觉得说了一堆废话,因为每个方案我都说了缺点。
**记忆锚点:**Redis → RDelayQueue → 峰填谷确实是消息队列 → 业的事交给专业的组件 → 求放在自己的消息队列 → 玩你完美替代消息队列
易错提醒:
- 避免数据库因为突发流量导致压力过大,其实就是在做削峰填谷,削峰填谷确实是消息队列的一个重要作用。
- 但是这个问题,回答的时候,我们还需要能知道这些方案的缺点和局限性。
加分表达:
- 这些方案都可行,但是改造成本是比较高的,不到万不得已的话不建议上。
- 如果这些方案都能玩你完美替代消息队列,那要消息队列干啥?
- 如果是写请求,需要考虑一致性的问题。
追问准备:
- 围绕「Redis」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「RDelayQueue」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「峰填谷确实是消息队列」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
避免数据库因为突发流量导致压力过大,其实就是在做削峰填谷,削峰填谷确实是消息队列的一个重要作用。除了削峰填谷以外,还有一些办法那就是尽量把流量在前面拦截住,不让他请求到数据库,也是比较常见的手段。
但是这个问题,回答的时候,我们还需要能知道这些方案的缺点和局限性。。。
仿消息队列
除了直接用消息队列比如RocketMQ,Kafka之之外,还有一些其他中间件也能实现类似的消息队列的功能,比如借助Redis也能轻松实现,Redis的ZSET可以用来实现延迟消息,也可以基于Key的过期消息实现延迟消息,还可以借助Redisson的RDelayQueue来实现延迟消息,都是可以的。比如:
但是这个方案我们不推荐啊。专业的事交给专业的组件,Redis就干缓存就行了,消息中间件我自由选择。。。但是面试的时候这个点也是可以说的。
限流
除了靠MQ来做缓冲,还有个办法那就是遇到突发流量的时候,我们干脆直接把过多的流量给他拦截住。通过限流、降级、熔断都能做到。
但是这么做,是对业务有损的,因为被拦截的流量是直接拒绝了,而不像MQ,其实是把请求放在自己的消息队列中做了缓冲,这个差别需要注意。
缓存
除了限流,还有个相对对业务影响比较小的减少数据库压力的方案,那就是加缓存。
在数据库请求之前,先通过缓存来做一层流量拦截,可以用Redis分布式缓存、也可以用本地缓存,总之就是命中缓存之后就不需要请求数据库了。
但是这个方案,只针对读请求有作用,并且需要业务上能接受一定的延迟,因为有缓存就意味着理论上一顿存在不一致的可能。
如果是写请求,需要考虑一致性的问题。
数据库优化
题目是如何避免因为突发流量导致压力过大,还有个思路那就是我不想办法减少流量,而是想办法减少压力。
流量我都用数据库承接,但是我想办法缓解数据库的压力不就行了么。
常见的方案有读写分离、分库分表、分布式数据库等。都是常见的分散压力的手段。
这些方案都可行,但是改造成本是比较高的,不到万不得已的话不建议上。
总结
我说了这么多方案,是不是觉得说了一堆废话,因为每个方案我都说了缺点。但是,but!!!!
如果这些方案都能玩你完美替代消息队列,那要消息队列干啥???消息队列的存在不就是通过削峰填谷来抗流浪的么。。。