一个大型的B2B或者B2C网站,必然要考虑访问用户量和站点自身的内容量问题,如果解决高访问量和海量内容带来的性能问题呢。当然对于非常成熟的企业来说可以采用分布式数据库和服务器,通过负载均衡同样能解决问题。而我们采用的是最简单、最容易、成本最低的实现方式,那就是使用静态镜像站点。

服务器一:阿里云服务器(原站点)

服务器二:阿里云OSS存储服务(镜像站点)

配置镜像站点映射到云服务器,云服务器的每个页面的访问会生成静态页面,当静态页面存在时,则直接读取静态页面,若静态页面不存在则动态生成。

那么问题来了,当网站内容有更新时,但页面静态文件已经存在的时候,用户访问时get到的永远是已经生成的那个静态文件,而无法读取到最新的页面内容。

也许你会说这个很简单,定时将旧的静态文件删除了不就好了嘛。没错,一开始本君也是这样做的,但很快就发现有问题,这样做行不通了。

问题一:定时清除所有静态文件,那么新的静态文件生成的期间,用户访问量若大,则性能问题一样会出现

问题二:网站海量的内容,生成静态文件不是一时半刻就能完成的,单个服务器能承受的并发很底,几十万个静态页面都要好几天才能生成完

问题三:最头痛的是阿里OSS存储服务器读取原站点的页面只有3s的响应时间,如果页面响应时间久了一点,则会出现文件找不到的错误。

接下来本君要说重点了,我们可以采用主动推送方式,具体如下:

1. 定义一张路由表,记录网站各页面的路由地址配置

2. 定义一张路由参数表,记录参数名称以及参数值读取的sql,sql支持指定时间点查询

3. 定义一张静态页面生成历史记录表。记录每个具体的页面url、路由名称、存储oss站点、页面生成状态、页面生成内容、生成时间

实现一个服务,每5分钟执行一次,读取路由参数表,并执行相应的sql,同样sql参数指定时间点为5分钟内。将sql执行读取到的参数与路由的url组合成一组具体的url,比较参数更新时间和历史记录生成的时间,若参数更新时间晚于html生成时间,则将记录插入到历史记录表标记状态为未请求。

同时每次任务执行读取指定条数未请求的记录,开始构造H

网友评论