大型电商网站商品详情页的系统架构中,当商品数据发生变更时,会将变更消息压入MQ消息队列中。缓存服务从消息队列中消费这条消息时,感知到有数据发生变更,便通过调用数据服务接口,获取变更后的数据,然后将整合好的数据推送到redis中。Nginx本地缓存的数据是有一定时间限制的,比如10分钟,当数据过期之后,它就会从redis获取到最新的缓存数据,并且缓存到本地。
用户浏览网页时,动态将Nginx本地数据渲染到本地html模板并返回给用户。
虽然没有直接返回html页面那么快,但是因为数据在本地缓存,所以也很快,耗费的就是动态渲染一个html页面的性能。如果html页面模板发生了变更,不需要将所有的页面重新静态化,也不需要发送请求,没有网络的开销,直接将数据渲染进最新的html页面模板后响应即可。
如果系统访问量很高,Nginx本地缓存过期失效了,redis中的缓存也被LRU算法给清理了,那么会有较高的访问量,从缓存服务调用商品服务。如果此时商品服务的接口发生故障,调用出现了延迟,缓存服务全部的线程都被这个调用商品服务的接口耗尽了,每个线程去调用商品服务接口的时候,都会卡住很长时间,后面大量的请求过来都会卡在那儿,此时缓存服务没有足够的线程去调用其他一些服务的接口,从而导致整个商品详情页无法正常显示。
