如果检测到系统满负载状态,拒绝请求也是一种保护措施。将过载保护设置在 CGI 入口层,快速将客户的直接请求返回。
用消息队列来缓冲瞬时流量,把同步的直接调用转换成异步的间接推送, 中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
在这里,消息队列就像“水库”一样,拦蓄上游的洪水,削减进入下游河道的洪峰流量,从而达到减免洪水灾害的目的。
利用线程池加锁等待也是一种常用的排队方式; 先进先出、先进后出等常用的内存排队算法的实现方式; 把请求序列化到文件中,然后再顺序地读文件(例如基于MySQL binlog 的同步机制)来恢复请求等方式。
-
核心思想是:
在不同的层次尽可能地过滤掉无效请求,让“漏斗”最末端的才是有效请求。 而要达到这种效果,我们就必须对数据做分层的校验。 -
分层校验的目的是: 在读系统中,尽量减少由于一致性校验带来的系统瓶颈,但是尽量将不影响性能的检查条件提前, 如用户是否具有秒杀资格、商品状态是否正常、用户答题是否正确、秒杀是否已经结束、是否非法请求、营销等价物是否充足等;
在写数据系统中,主要对写的数据(如“库存”)做一致性检查, 最后在数据库层保证数据的最终准确性(如“库存”不能减为负数)。
- 答题
主要是为了增加流程的复杂度,从而达到两个目的。 第一个目的是防止部分买家使用秒杀器在参加秒杀时作弊。 第二个目的其实就是延缓请求。
可以采用发放优惠券、发起抽奖活动等方式,将一部分流量分散到其他地方,这样也能起到缓冲流量的作用。