一般来说,我们的数据是存储在数据库的,当用户访问服务时,用户通过后端请求数据库数据,最害怕的就是出现热Key、大Value情况,所谓热Key就是某个值瞬间被上万甚至十万百万个用户请求
1.限流
在电商系统的秒杀中,也会有大批量的用户同时涌入,鉴于只有少部分用户能够秒杀成功,所以要限制大部分流 量,只允许少部分流量进入服务后端
- Netflix的hystrix
- 阿里系开源的sentinel
(1):nginx也可以做限流
Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数
limit_req_zone,limit_conn_zone、
限流算法:漏桶算法
(2):gatway网关实现限流
限流算法:令牌桶算法
配置加入令牌的速率,和令牌桶能放入的最大令牌数量,只有请求获得了令牌才能访问,没有获得令牌就会拒绝访问,令牌桶算法是基于redis实现的,默认使用redis的RateLimter限流算法实现的
配置了RequestRateLimiter的限流过滤器
burstCapacity,令牌桶总容量。
replenishRate,令牌桶每秒填充平均速率。
key-resolver,用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。
KeyResolver需要实现resolve方法,比如根据Hostname进行限流,则需要用hostAddress去判断。实现完KeyResolver之后,需要将这个类的Bean注册到Ioc容器中
2.页面静态化
首先我们可以使用Freemarker对页面进行静态化,让用户减少跟后端服务器之间的交互。这样就能降低服务器的 压力,如果条件允许我们可以采用CDN加速
3.引入redis
总所周知计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存。将热点数据存放在内存中随用随取,不仅可以降低连接到数据库的请求,避免数据库挂掉;还可以减少频繁重复的复杂逻辑结果。需要注意的是,无论是击穿、穿透与雪崩,都是在高并发前提下。
4.MQ,异步解耦