问题
最近面试的时候,被问到了限流这个功能,实现限流的组件有很多,其中比较有名的是 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请求量啊。
结论
- 我没明白这个场景需要用到限流吗?