30 July 2024

问题

最近面试的时候,被问到了限流这个功能,实现限流的组件有很多,其中比较有名的是 sentinel,我的问题由此产生

秒杀系统吧

秒杀是流量最大,并发最高的场景之一了,如果要限流,这个场景必不可少。内部的逻辑我们只考虑redis,mq。 当时是拿这个例子来说的,我现在也用这个例子来回顾,回头大家也可以想下这个问题,放到自己的系统,限流有没有用嘛。

  • 收到请求打到了tomcat容器
  • tomcat的并行请求数和qps,tomcat的机器个数
  • boot的能处理的请求数
  • 限流sentinel层
  • redis的部署方式,redis能处理的请求数

背景

如果是秒杀,那肯定是先限流,之后令牌桶拿令牌,之后分布式锁,扣库存(这个库存用redis存的),发mq处理后续流程。这个流程对不对不重要,重要的是我当你tomcat一秒钟处理2w个请求。往下看问问题嘛。

  • 我们tomcat的最大线程数200,里面的操作是redis和发mq,我算成1s处理2w个请求,很可以了吧?
  • 那我们经常面试提的系统百万并发,是不是请求的先打到tomcat容器,才能进行下面的操作(外层没有做任何限流,上面有前提,一般系统也没有做)
  • 100w的请求,一个tomcat一秒钟处理2w,那就需要50个tomcat容器。这个没有问题
  • 先跨过sentinel层,redis的并发是10w级吧,我集群部署,3个主从,处理30w并发没啥问题吧。反正redis处理能力肯定比tomcat强大,没毛病吧?

问题很简单,但是我真的不知道限流限的是什么(先看看上面的前提)

  • 那我在tomcat和redis中间加的那层限流到底是做了什么用?用tomcat限制redis的处理速度吗?当然你可以说不止redis,还有别的操作,可是你秒杀会那么做吗?最多就是发个mq,发mq你用异步的方式,能多慢,我可是当tomcat是2w请求量啊。

结论

  • 我没明白这个场景需要用到限流吗?


blog comments powered by Disqus