一个大型的B2B或者B2C网站,必然要考虑访问用户量和站点自身的内容量问题,如果解决高访问量和海量内容带来的性能问题呢。当然对于非常成熟的企业来说可以采用分布式数据库和服务器,通过负载均衡同样能解决问题。而我们采用的是最简单、最容易、成本最低的实现方式,那就是使用静态镜像站点。
服务器一:阿里云服务器(原站点)
服务器二:阿里云OSS存储服务(镜像站点)
配置镜像站点映射到云服务器,云服务器的每个页面的访问会生成静态页面,当静态页面存在时,则直接读取静态页面,若静态页面不存在则动态生成。
那么问题来了,当网站内容有更新时,但页面静态文件已经存在的时候,用户访问时get到的永远是已经生成的那个静态文件,而无法读取到最新的页面内容。
也许你会说这个很简单,定时将旧的静态文件删除了不就好了嘛。没错,一开始本君也是这样做的,但很快就发现有问题,这样做行不通了。
问题一:定时清除所有静态文件,那么新的静态文件生成的期间,用户访问量若大,则性能问题一样会出现
问题二:网站海量的内容,生成静态文件不是一时半刻就能完成的,单个服务器能承受的并发很底,几十万个静态页面都要好几天才能生成完
问题三:最头痛的是阿里OSS存储服务器读取原站点的页面只有3s的响应时间,如果页面响应时间久了一点,则会出现文件找不到的错误。
接下来本君要说重点了,我们可以采用主动推送方式,具体如下:
1. 定义一张路由表,记录网站各页面的路由地址配置
2. 定义一张路由参数表,记录参数名称以及参数值读取的sql,sql支持指定时间点查询
3. 定义一张静态页面生成历史记录表。记录每个具体的页面url、路由名称、存储oss站点、页面生成状态、页面生成内容、生成时间
实现一个服务,每5分钟执行一次,读取路由参数表,并执行相应的sql,同样sql参数指定时间点为5分钟内。将sql执行读取到的参数与路由的url组合成一组具体的url,比较参数更新时间和历史记录生成的时间,若参数更新时间晚于html生成时间,则将记录插入到历史记录表标记状态为未请求。
同时每次任务执行读取指定条数未请求的记录,开始构造HttpWebRequest请求原站点,读取到最新的html内容。
并更新到历史记录表,同时判断当响应状态为200时(状态判断是为了避免因数据问题页面出错,而到账oss站点页面出错),则同步html内容到oss站点。
有时候,如果我们对于页面的布局做了修改,可能需要整站更新,这就需要一定时间断之后才能更新完成。但是如果运维人员有更新产品数据,那么我们应该优先更新5分钟内有更新的这些数据。所以修改了5分钟内读取到数据生成的url记录会直接执行。
同时,我们会发现这样做还带来另一个好处,那就是自动化测试。当网站大量生成静态页面时,每个静态页面的生成状态,以及生成内容都会保存到数据表中。我们就可以定期分析这些访问记录,检查生成异常的这些数据,就可以轻易的检查到项目代码中存在的bug,进而去修正它。