文章目录
- 一、限流操作:
- 二、应用级别限流与限流实现:
-
- 方法一、使用google的guava,令牌桶算法实现:平滑突发限流 ( SmoothBursty) 、平滑预热限流 ( SmoothWarmingUp) 实现
- 方法二、请求一次redis增加1,key可以是IP+时间或者一个标识+时间,没有就创建,需要设置过期时间
- 方法三、分布式限流,分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使用redis+lua或者nginx+lua技术进行实现
- 方法四、可以使用池化技术来限制总资源数:连接池、线程池。比如分配给每个应用的数据库连接是 100,那么本应用最多可以使用 100 个资源,超出了可以 等待 或者 抛异常
- 方法五、限流总并发/连接/请求数
- 方法六、限流某个接口的总并发/请求数,使用 Java 中的 AtomicLong
- 方法七、 限流某个接口的时间窗请求数使用 Guava 的 Cache
一、限流操作:
为什么限流
是防止用户恶意刷新接口,因为部署在外部服务器,并且我们采用websocket的接口实现的,公司没有对硬件升级,导致程序时长崩溃,为了解决这个问题,请教公司的大佬,提出一个方案,限流操作。
但是最后找到原因所在,解决了,吞吐量1万6左右,用的测试服务器,进行测试的,我开发的笔记本进行压测,工具是Jmeter,结果我的电脑未响应,卡了,服务器还没有挂。
限流方法
常见的限流:
- Netflix的hystrix
- 阿里系开源的sentinel
- 说白了限流,为了处理高并发接口那些方式:队列,线程,线程池,消息队列、 kafka、中间件、sentinel:直接拒绝、Warm Up、匀速排队等
技术层面:
- 判断是否有相同的请求,可以通过自身缓存挡住相同请求
- 用负载均衡,比如nginx
- 用缓存数据库,把热点数据get到缓存中,redis,ES</