考虑因素:当QPS达到极限时,CPU使用率是否超过95%(锁限制、I/O阻塞),不然还有待提高空间。
架构原则:(4要1不要)
1.数据要尽可能少(请求数据与响应数据)。减小数据的压缩与编码消耗CPU以及网络传输
2.请求数要尽可能少。CSS与JS请求合并,后台请求数也要少(每次请求3次握手4次挥手)
3.后台服务路径要短。后台微服务链接要少,能够加强可用性,同时提高性能(减小节点数据交互序列化及网络传输损耗)
4.依赖要尽可能减小。降级非必要信息(优惠券,成交列表,商品推荐等),减小页面复杂度。
5.不要有单点。
设计方案:
先作数据的动静分离:数据中是否含有和访问者相关的个性化数据,页面html、CSS、JS、图片等静态信息由nginx来处理,CDN来抗峰值
将静态数据页面信息缓存到用户浏览器中
将动态请求的读数据Cache在Web端,将商品相关信息cache起来。每次请求加载商品信息直接缓存读取。
对读数据不作强一致性校验
对写数据进行基于时间的合理分片:秒杀答题
对写请求作限流保护,多余的请求用RateLimiter、Semaphore 限流过滤
对写数据进行强一致性校验
页面静态化:将活动页面上的全部能够静态的元素所有静态化,并尽可能减小动态元素。经过CDN来抗峰值。
禁止重复提交:用户提交以后按钮置灰,禁止重复提交
用户限流:在某一时间段内只容许用户提交一次请求,好比能够采起IP限流html
限制IP访问频率:咱们上面拦截了浏览器访问的请求,但针对某些恶意攻击或其它插件,在nginx限制访问频率。
削峰方案:
一个是经过队列来缓冲请求,即控制请求的发出;nginx
一个是经过答题来延长请求发出的时间,在请求发出后承接请求时进行控制,最后再对不符合条件的请求进行过滤;算法
最后一种是对请求进行分层过滤。浏览器
一、将动态请求的读数据缓存(Cache)在 Web 端,过滤掉无效的数据读;缓存
二、对读数据不作强一致性校验,减小由于一致性校验产生瓶颈的问题;网络
三、对写数据进行基于时间的合理分片,过滤掉过时的失效请求;架构
四、对写请求作限流保护,将超出系统承载能力的请求过滤掉;微服务
五、对写数据进行强一致性校验只保留最后有效的数据。性能
限流方案:
1.令牌桶限流:可以限制数据的平均传输速率外,还容许某种程度的突发传输,RateLimiter(侧重于速率) Semaphore(侧重于线程个数)。
2.漏捅算法:固定速率传输,资源没法最优化处理。
例如:RateLimiter limiter=RateLimiter.create(
5);