Skip to content

面试速答(先看这里)

**一句话结论:**避免数据库因为突发流量导致压力过大,其实就是在做削峰填谷,削峰填谷确实是消息队列的一个重要作用。

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来实现延迟消息,都是可以的。比如:

📄 ✅如何基于Redisson实现一个延迟队列

打开文档:✅如何基于Redisson实现一个延迟队列

但是这个方案我们不推荐啊。专业的事交给专业的组件,Redis就干缓存就行了,消息中间件我自由选择。。。但是面试的时候这个点也是可以说的。

限流 ​

除了靠MQ来做缓冲,还有个办法那就是遇到突发流量的时候,我们干脆直接把过多的流量给他拦截住。通过限流、降级、熔断都能做到。

📄 ✅限流、降级、熔断有什么区别?

打开文档:✅限流、降级、熔断有什么区别?

但是这么做,是对业务有损的,因为被拦截的流量是直接拒绝了,而不像MQ,其实是把请求放在自己的消息队列中做了缓冲,这个差别需要注意。

缓存 ​

除了限流,还有个相对对业务影响比较小的减少数据库压力的方案,那就是加缓存。

在数据库请求之前,先通过缓存来做一层流量拦截,可以用Redis分布式缓存、也可以用本地缓存,总之就是命中缓存之后就不需要请求数据库了。

📄 ✅如何实现多级缓存?

打开文档:✅如何实现多级缓存?

但是这个方案,只针对读请求有作用,并且需要业务上能接受一定的延迟,因为有缓存就意味着理论上一顿存在不一致的可能。

如果是写请求,需要考虑一致性的问题。

📄 ✅如何解决Redis和数据库的一致性问题?

打开文档:✅如何解决Redis和数据库的一致性问题?

数据库优化 ​

题目是如何避免因为突发流量导致压力过大,还有个思路那就是我不想办法减少流量,而是想办法减少压力。

流量我都用数据库承接,但是我想办法缓解数据库的压力不就行了么。

常见的方案有读写分离、分库分表、分布式数据库等。都是常见的分散压力的手段。

📄 ✅什么是读写分离?如何实现?

打开文档:✅什么是读写分离?如何实现?

📄 ✅什么是分库?分表?分库分表?

打开文档:✅什么是分库?分表?分库分表?

📄 ✅什么是分布式数据库,有什么优势?

打开文档:✅什么是分布式数据库,有什么优势?

这些方案都可行,但是改造成本是比较高的,不到万不得已的话不建议上。

总结 ​

我说了这么多方案,是不是觉得说了一堆废话,因为每个方案我都说了缺点。但是,but!!!!

如果这些方案都能玩你完美替代消息队列,那要消息队列干啥???消息队列的存在不就是通过削峰填谷来抗流浪的么。。。