【高并发】- 生产级系统搭建 - 3

前言

    本章讲解高并发系统动静分离方案设计、热点数据处理、管控等思想。

1. 动静分离方案设计

    动静分离实质,将静态页面与动态页面(或者静态数据与动态数据)解耦分离,用不同系统承载对应流量。这样可以提升整个服务的访问性能和可维护性能。

1.1 什么是静态数据

静态数据是指页面中几乎不怎么变化的数据(即不依据用户的Cookie、基本信息、地域、时间等各种属性来生成的数据),例如:

  • CSS和JavaScript文件中的静态数据。

  • 活动页中的HTML静态文件。

  • 图片等相关资源文件。

  • 其他与用户信息无关的静态数据。

对于这些分离出来的静态数据,可以进行缓存。在缓存之后,访问这些静态数据的效率就高了,系统运行速度也更快了。可以使用代理服务器进行静态数据的缓存,如:浏览器本地缓存(包括App端、PC端)、CDN、Nginx、Squid、Varnish等,如下图:

1.2 什么是动态数据

动态数据是指根据当前用户属性动态生成的数据。

处理动态数据主要体现在技术架构上,一般采取如下技术方案:

  • 清晰的分层架构。

  • 服务架构。

  • 缓存架构。

1.3 如何实施动静分离架构

实施动静分离架构可以采用“分而治之”的办法,即将动态数据和静态数据解耦,分别使用各自的架构系统来承载对应的流量:

  • 对于静态数据,建议缩短用户请求路径,因为路径越短,访问速度就越快。另外,应尽可能地将静态数据缓存起来。

  • 对于动态数据,一般用户端需要和服务端进行交互才能获取,所以,请求路径越长,访问速度就越慢。

(ps:获取静态数据和获取动态数据的【域名】不同)

1.4 使用“页面静态化”技术实现动静分离架构

访问静态数据的速度很快,而访问动态数据的速度较慢。那么是否可提前生成好需要的动态获取的数据,然后使用静态页面加速技术来访问这些数据呢?如果可以这样,那访问动态数据的速度就变快了。

(1)页面静态化 技术

页面静态化技术是指:直接缓存HTTP连接,而不仅是缓存数据。代理服务器根据请求的URL直接返回HTTP对应的响应头及响应消息体,流程简洁且高效。

例如,在获取商品详情页数据时,可以提前将该商品详情页的动态数据生成好,然后使用静态页面加速技术访问这些数据。如此,系统的整体性能将得到显著提升,且会大大提升用户体验。

(2)页面静态化 技术适用场景

    页面静态化技术能加速对动态数据的获取,那它是不是在所有场景都适用呢?其实不然,如果使用不当,则不仅不会使系统性能得到提升,反而会使系统性能下降。

    因为页面静态化技术需要将动态数据提前生成,所以,页面静态化技术适用于【动态数据总量不是很大,生成的静态页面数量不多】的业务场景。例如

  • 在“秒杀”活动中,如果“秒杀”商品数量有限,则可以生成数量有限的“秒杀”商品静态网页。

  • 在二手车业务中,如果二手车库存量不是很大,则可以提前生成二手车的静态网页。

又比如,大型播客之类的网站就不适合使用“页面静态化”技术,因为其中的文章数量是以【亿】为单位的,生成这种体量的静态网页后访问速度会变得特别慢。

2 热点数据处理

场景:

(1)大型电商网站(淘宝、京东等)的商品访问量都是以【亿】为单位的,每天都有【千万】级别的商品被上亿用户访问,其中部分商品被很大一部分流量访问和下单,即这部分商品是【热点商品】

(热点商品的典型场景是“秒杀”业务场景。在“秒杀”业务中,热点商品在极短的时间内【1s ~ 2s】被大量用户访问,系统将面对流量洪峰的挑战)

(2)微博每天都会产生巨大流量的微博条目,比如突然某位明星宣布“和某某正式结婚”,这条微博在发出后会被“千万”级别的“粉丝”查看和转发,这条微博可以被定义为“热点微博”。

2.1 什么是热点数据?

    在上面两个场景中,“热点商品”和“热点微博”均为热点数据。在一定时间内被大量用户访问的数据就是热点数据。热点数据又被分为“静态热点数据”和“动态热点数据”。

  • 静态热点数据:可以被提前预知的数据。例如,商家事先决定好了在哪一天要进行“秒杀”活动,或者系统通过历史数据预测出哪个商品容易成为“热点数据”。

  • 动态热点数据:不能被提前预知的数据。例如,大明星宣布的大消息,或者淘宝、京东等平台突然做广告导致的“热点数据”。

2.1 如何发现热点数据?

    静态热点数据的发现比较容易,因为,要么是可以事先定义的热点数据,要么是可以通过历史数据预测出的热点数据。之后,将发现的热点数据写入缓存。

    动态热点数据的发现很难。但是如果能实时地发现动态热点数据,则对于促进商品的销售将起到很大的作用,同时对于系统也可以起到很好的保护作用。

发现动态热点数据的建议:

(1)使用日志收集组件(如Flume组件),实时地收集各个中间件及服务的日志,例如对代理层Nginx和后端服务层日志的实时收集。

(2)将实时收集到的日志信息发送到消息中间件Kafka中。

(3)构建一套流式计算系统,实时地从Kafka中 “消费” 日志信息。

(4)流式计算系统对日志信息进行实时流式计算,得到热点数据。

(ps:发现动态热点数据,只要能达到近实时发现【一般为2~3s】即可。)

2.3 如何处理热点数据

    发现热点数据后的一般做法是:优化、限制和隔离。

(1)热点数据的优化。

直接将发现的热点数据写入分布式缓存,并且根据业务情况对其设置缓存过期时间。

(2)热点数据的限制。

热点数据限制是一种保护系统的机制,目的是不让热点数据抢占其他请求的资源。

(例如,使用线程池隔离技术,将每个热点数据的处理过程放在独立的线程池内,这样可以避免大流量的冲击而影响其他请求使用及其资源。)

(3)热点数据的隔离。

热点数据的隔离也是一种保护机制,不能因为数据访问量过大而造成整个业务的崩溃。

(例如,针对“秒杀”场景,可以先将“秒杀”业务和其他主线业务隔离开,防止他们互相影响;然后,将“秒杀”应用独立部署,且使用独立的域名;最后,“秒杀”系统使用独立的数据库进行存储。)

3. 大流量的高效管控

    在“秒杀”场景中,海量的用户会带来瞬时的流量洪峰。瞬时的流量洪峰会带来严重的服务端读/写性能问题、数据库锁,以及服务器资源占用等问题。

3.1 流量分层

    请求路径越短,则访问速度肯定越快。但是,业务特性决定了不能永远将数据放在静态缓存中。

    对于瞬时流量洪峰采用倒三角的分层级逐层控制方式,共分为CDN、反向代理(Nginx)、后端服务及DB四个层级。

在部分“秒杀”业务场景中,用户的浏览器也可以进行一级数据缓存:浏览器是最接近用户的,对于时效很长且体积不大的静态数据,可以将其放入浏览器本地缓存中。

3.2 流量分层控制

(1)CDN层流量控制

    由动静分离技术可以想到:应提前生成尽可能多的数据,然后将其放入CDN节点缓存中(因为CDN层在物理架构上离用户比较近)。

    所以,如果绝大部分的流量都在这一层获取数据,那么到达后端的流量就会减少很多。

(2)反向代理层流量控制

    在动静分离方案中,可以通过“页面静态化”技术可以加速动态数据的获取,即提前将动态数据生成好,然后对齐进行静态化处理。

    所以,这里就可以依据“页面静态化”技术,通过后端服务Job的方式定时提前生成好前端需要的静态数据,然后,将其发送到内容分发服务上,内容分发服务会将这些静态数据分发给所有的反向代理服务器。

在“秒杀”业务中,活动详情页上有一个倒计时的模块,用户可以看到当前“秒杀”活动还剩多久时间开始。这种逻辑简单的功能可以使用Nginx来实现:利用nginx-lua插件,使用Lua脚本获取当前Nginx服务器的时间来计算倒计时。另外,商品库存数据也可以通过Nginx直接访问分布式缓存来获取。

    在“秒杀”业务中,可能会有人利用“秒杀器”进行不公平竞争,且有可能存在竞争对手恶意刷请求的情况。如果存在这种情况,那本次活动就是有风险的,万一被恶意流量独占了库存,则会导致正常用户不能抢购商品,也可能这种恶意请求会对后端系统造成严重冲击,甚至造成后端系统瘫痪。

    对于这种恶意请求,最好有一套机制能提前感知,并将恶意请求提前封存。可以在Nginx层中控制;也可以在Nginx中配置用户的访问频率(例如每分钟最多只能访问10次);还可以使用Lua脚本编写一些简单业务逻辑的接口,例如,通过调用接口直接封掉指定IP地址或UserAgent。

(可以利用大数据的日志收集组件:如Flume,从Nginx上采集日志,将采集到的日志写入存储系统:如HBase中,然后风控平台对存储系统中的日志进行风险分析。对于有风险的请求,风控平台可以直接调用Nginx中的Lua风控接口对其进行封停处理,例如禁止某个IP地址或将请求的UserAgent封停。)

(3)后端服务层流量控制

对于服务层的流量控制,有以下几点建议:

  • 在程序开发上,代码独立,不要与其他平台项目合在一起。

  • 在部署时,应用独立部署,分散流量,避免不合适的流量影响主体业务。

  • 使用独立域名,或者按照一定的URL规则在反向代理层进行路由。

  • 做好系统保护和限流,进一步减少不必要的流量。

(当【达到系统中的请求书数】明显大于【系统能够处理的最大请求数】时,可以直接拒绝多余的请求,直接返回“秒杀”活动结束的信息)

(4)数据库层流量控制

写数据库的流量就是真正下单成功的流量,即需要扣减库存的动作,有如下建议:

  • 如果不是临时活动,则建议使用独立的数据库作为“秒杀”活动的数据库。

  • 将数据库配置成读写分离。

  • 尝试去除行锁。

    章节拆分比较细,是为了让大家看的过程中,能够尽可能把内容接收进去,下章节讲解高并发系统的扣减库存的相关方案介绍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值